Example #1
0
        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>());
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        public async Task <TokenSet> GetTokenSetForAthleteId(string athleteId, bool attemptRenew)
        {
            RepositoryEnrichedTokenSet savedToken = await _tokenRepository.GetForAthlete(athleteId);

            RepositoryEnrichedTokenSet tokenSet = await CreateTokenSetWithRenewIfRequired(attemptRenew, savedToken);

            return(tokenSet);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
 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);
 }
Example #7
0
        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));
        }
Example #8
0
        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);
        }
Example #9
0
        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();
        }