diff --git a/src/Infrastructure/Identity/IdentityService.cs b/src/Infrastructure/Identity/IdentityService.cs index 58b7cf6e..cb38b55c 100644 --- a/src/Infrastructure/Identity/IdentityService.cs +++ b/src/Infrastructure/Identity/IdentityService.cs @@ -148,10 +148,19 @@ public async Task RefreshTokenAsync(string token, string r throw new AuthenticationException("This refresh token does not match this Jwt."); } - _context.RefreshTokens.Remove(storedRefreshToken); + var jweToken = CreateJweToken(user); + + storedRefreshToken.JwtId = jweToken.Id; + storedRefreshToken.ExpiryDateTime = + LocalDateTime.FromDateTime(DateTime.UtcNow.AddDays(_jweSettings.RefreshTokenLifetimeInDays)); + _context.RefreshTokens.Update(storedRefreshToken); await _context.SaveChangesAsync(); - return await GenerateAuthenticationResultForUserAsync(user); + return new AuthenticationResult() + { + Token = jweToken, + RefreshToken = _mapper.Map(storedRefreshToken) + }; } private ClaimsPrincipal? GetPrincipalFromToken(string token) @@ -196,6 +205,11 @@ public async Task RefreshTokenAsync(string token, string r throw new AuthenticationException("Username or password is invalid."); } + var existedRefreshTokens = _context.RefreshTokens.Where(x => x.User.Email!.Equals(user.Email)); + + _context.RemoveRange(existedRefreshTokens); + await _context.SaveChangesAsync(); + return (await GenerateAuthenticationResultForUserAsync(user), _mapper.Map(user)); } @@ -226,6 +240,28 @@ public async Task LogoutAsync(string token, string refreshToken) } private async Task GenerateAuthenticationResultForUserAsync(User user) + { + var token = CreateJweToken(user); + var utcNow = DateTime.UtcNow; + + var refreshToken = new RefreshToken() + { + JwtId = token.Id, + User = user, + CreationDateTime = LocalDateTime.FromDateTime(utcNow), + ExpiryDateTime = LocalDateTime.FromDateTime(utcNow.AddDays(_jweSettings.RefreshTokenLifetimeInDays)) + }; + + await _context.RefreshTokens.AddAsync(refreshToken); + await _context.SaveChangesAsync(); + return new() + { + Token = token, + RefreshToken = _mapper.Map(refreshToken) + }; + } + + private SecurityToken CreateJweToken(User user) { var utcNow = DateTime.UtcNow; var authClaims = new List @@ -252,20 +288,6 @@ private async Task GenerateAuthenticationResultForUserAsyn var token = handler.CreateToken(tokenDescriptor); - var refreshToken = new RefreshToken() - { - JwtId = token.Id, - User = user, - CreationDateTime = LocalDateTime.FromDateTime(utcNow), - ExpiryDateTime = LocalDateTime.FromDateTime(utcNow.AddDays(_jweSettings.RefreshTokenLifetimeInDays)) - }; - - await _context.RefreshTokens.AddAsync(refreshToken); - await _context.SaveChangesAsync(); - return new() - { - Token = token, - RefreshToken = _mapper.Map(refreshToken) - }; + return token; } } \ No newline at end of file