예제 #1
0
        public async Task <ServiceResponse <RefreshTokenResponse> > RefreshTokenAsync(string accessToken, string refreshToken)
        {
            if (string.IsNullOrWhiteSpace(accessToken))
            {
                ErrorResultToReturn = new ErrorResult("Pusty access token");
                throw new RestException(HttpStatusCode.BadRequest, ErrorResultToReturn);
            }

            if (string.IsNullOrWhiteSpace(refreshToken))
            {
                ErrorResultToReturn = new ErrorResult("Pusty refresh token");
                throw new RestException(HttpStatusCode.BadRequest, ErrorResultToReturn);
            }

            var validatedToken = _jwtGenerator.GetPrincipalFromToken(accessToken);

            if (validatedToken == null)
            {
                ErrorResultToReturn = new ErrorResult("Nieprawidłowy token");
                throw new RestException(HttpStatusCode.BadRequest, ErrorResultToReturn);
            }

            var storedRefreshToken =
                await Context.RefreshTokens.SingleOrDefaultAsync(x => x.Token == refreshToken);

            var validationResult = _jwtGenerator.ValidateRefreshToken(storedRefreshToken, validatedToken);

            if (validationResult.Any())
            {
                ErrorResultToReturn = new ErrorResult(Errors.AuthErrors.AnErrorOccuredWhileAuthenticating, validationResult.ToArray());
                throw new RestException(HttpStatusCode.BadRequest, ErrorResultToReturn);
            }

            storedRefreshToken.Used = true;
            Context.RefreshTokens.Update(storedRefreshToken);

            await SaveChangesAsync(new[] { "Wystąpił bład podczas aktualizowania tokena" });

            var user = await UserManager.FindByIdAsync(_jwtGenerator.GetUserIdFromToken(validatedToken));

            if (user == null)
            {
                ErrorResultToReturn = new ErrorResult(Errors.AccountErrors.UserNotFound);
                throw new RestException(HttpStatusCode.BadRequest, ErrorResultToReturn);
            }

            var tokens = await _jwtGenerator.CreateTokenAsync(user);

            return(new ServiceResponse <RefreshTokenResponse>(HttpStatusCode.OK, new RefreshTokenResponse {
                RefreshToken = tokens.RefreshToken, Token = tokens.Token
            }));
        }
예제 #2
0
        //public Task<bool> Logout()
        //{
        //    throw new NotImplementedException();
        //}

        public async Task <RefreshTokenResponse> RefreshTokenAsync(string accessToken, string refreshToken)
        {
            if (string.IsNullOrWhiteSpace(accessToken))
            {
                return(null);
            }

            if (string.IsNullOrWhiteSpace(refreshToken))
            {
                return(null);
            }

            var validatedToken = _jwtGenerator.GetPrincipalFromToken(accessToken);

            if (validatedToken == null)
            {
                return(null);
            }

            var storedRefreshToken =
                await _context.RefreshTokens.SingleOrDefaultAsync(x => x.Token == refreshToken);

            var validationResult = _jwtGenerator.ValidateRefreshToken(storedRefreshToken, validatedToken);

            if (validationResult.Any())
            {
                return(null);
            }

            storedRefreshToken.Used = true;
            _context.RefreshTokens.Update(storedRefreshToken);

            await _context.SaveChangesAsync();

            var user = await UserManager.FindByIdAsync(_jwtGenerator.GetUserIdFromToken(validatedToken));

            if (user == null)
            {
                return(null);
            }

            var tokens = await _jwtGenerator.CreateTokenAsync(user);

            return(new RefreshTokenResponse {
                RefreshToken = tokens.RefreshToken, Token = tokens.Token
            });
        }