public async Task SaveToken() { using (var httpTest = new HttpTest()) { // Arrange RepositoryEnrichedTokenSet tokenSet = new RepositoryEnrichedTokenSet { AthleteId = "1", AccessToken = "2", ExpiresAtUtc = DateTime.UtcNow.AddDays(-1), RefreshToken = "3" }; _tokenRepository.GetForAthlete("1").Returns(tokenSet); httpTest.RespondWith(JsonConvert.SerializeObject(new StravaTokenExchangeResponse { access_token = "4", athlete = new TokenExchangeAthlete { id = "1" }, expires_at = (int)DateTime.UtcNow.AddDays(1).Subtract(new DateTime(1970, 1, 1)).TotalSeconds, refresh_token = "5" })); // Act await _testSubject.GetTokenSetForAthleteId("1", true); // Assert await _tokenCache.Received().SaveTokenSet("1", "4", "5", Arg.Any <DateTime>()); await _tokenRepository.Received().SaveTokenSet("1", "4", "5", Arg.Any <DateTime>()); } }
public async Task ReturnValidTokenWhenExpiredAndRenewAllowed() { using (var httpTest = new HttpTest()) { // Arrange RepositoryEnrichedTokenSet tokenSet = new RepositoryEnrichedTokenSet { AthleteId = "1", AccessToken = "2", ExpiresAtUtc = DateTime.UtcNow.AddDays(-1), RefreshToken = "3" }; _tokenRepository.GetForAccessToken("1").Returns(tokenSet); httpTest.RespondWith(JsonConvert.SerializeObject(new StravaTokenExchangeResponse { access_token = "4", athlete = new TokenExchangeAthlete { id = "1" }, expires_at = (int)DateTime.UtcNow.AddDays(1).Subtract(new DateTime(1970, 1, 1)).TotalSeconds, refresh_token = "5" })); // Act TokenSet result = await _testSubject.GetTokenSetForAccessToken("1", true); // Assert Assert.Equal("1", result.AthleteId); Assert.Equal("4", result.AccessToken); httpTest.ShouldHaveCalled(_options.TokenEndPoint); } }
public async Task <TokenSet> GetTokenSetForAthleteId(string athleteId, bool attemptRenew) { RepositoryEnrichedTokenSet savedToken = await _tokenRepository.GetForAthlete(athleteId); RepositoryEnrichedTokenSet tokenSet = await CreateTokenSetWithRenewIfRequired(attemptRenew, savedToken); return(tokenSet); }
public async Task <RepositoryEnrichedTokenSet> GetForAccessToken(string accessToken) { IDatabase redis = _connectionMultiplexerProvider.Get().GetDatabase(); string json = await redis.StringGetAsync(accessToken); if (!string.IsNullOrWhiteSpace(json)) { RepositoryEnrichedTokenSet tokenSet = JsonConvert.DeserializeObject <RepositoryEnrichedTokenSet>(json); return(tokenSet); } return(null); }
public async Task <TokenSet> GetTokenSetForAccessToken(string accessToken, bool attemptRenew) { // First try the cache RepositoryEnrichedTokenSet persistedTokenSet = await _tokenCache.GetForAccessToken(accessToken); if (persistedTokenSet == null) { persistedTokenSet = await _tokenRepository.GetForAccessToken(accessToken); } RepositoryEnrichedTokenSet result = await CreateTokenSetWithRenewIfRequired(attemptRenew, persistedTokenSet); return(result); }
public async Task SaveTokenSet(string athleteId, string accessToken, string refreshToken, DateTime accessTokenExpiresAtUtc) { RepositoryEnrichedTokenSet tokenSet = new RepositoryEnrichedTokenSet { AthleteId = athleteId, AccessToken = accessToken, ExpiresAtUtc = accessTokenExpiresAtUtc, RefreshToken = refreshToken }; string json = JsonConvert.SerializeObject(tokenSet); IDatabase redis = _connectionMultiplexerProvider.Get().GetDatabase(); TimeSpan ttl = tokenSet.ExpiresAtUtc.Subtract(DateTime.UtcNow); await redis.StringSetAsync(tokenSet.AccessToken, json, ttl); }
public async Task ThrowExceptionWhenExpiredAndNoRenewal() { // Arrange RepositoryEnrichedTokenSet tokenSet = new RepositoryEnrichedTokenSet { AthleteId = "1", AccessToken = "2", ExpiresAtUtc = DateTime.UtcNow.AddDays(-1), RefreshToken = "3" }; _tokenRepository.GetForAccessToken("2").Returns(tokenSet); // Act await Assert.ThrowsAsync <TokenSetExpiredException>(() => _testSubject.GetTokenSetForAccessToken("2", false)); }
public async Task ReturnValidTokenWhenFound() { // Arrange RepositoryEnrichedTokenSet tokenSet = new RepositoryEnrichedTokenSet { AthleteId = "1", AccessToken = "2", ExpiresAtUtc = DateTime.UtcNow.AddDays(1), RefreshToken = "3" }; _tokenRepository.GetForAccessToken("2").Returns(tokenSet); // Act TokenSet result = await _testSubject.GetTokenSetForAccessToken("2", false); // Assert Assert.Equal("1", result.AthleteId); Assert.Equal("2", result.AccessToken); }
private async Task <RepositoryEnrichedTokenSet> CreateTokenSetWithRenewIfRequired( bool attemptRenew, RepositoryEnrichedTokenSet savedToken) { if (savedToken == null) { throw new TokenSetNotFoundException(); } if (savedToken.ExpiresAtUtc >= DateTime.UtcNow) { return(savedToken); } if (attemptRenew) { return(await RenewToken(savedToken.AthleteId, savedToken.RefreshToken, savedToken.AccessToken)); } throw new TokenSetExpiredException(); }