| | | 1 | | using KT.Domain.Ports; |
| | | 2 | | using KT.Modules.Security.Core.Application.Contracts; |
| | | 3 | | using KT.Modules.Security.Core.Domain.Ports; |
| | | 4 | | using KT.Modules.Security.Presentation.Contracts; |
| | | 5 | | using KT.Modules.Security.Presentation.Dto; |
| | | 6 | | |
| | | 7 | | namespace KT.Modules.Security.Core.Application |
| | | 8 | | { |
| | 18 | 9 | | internal class RefreshTokenService( |
| | 18 | 10 | | IRefreshTokenRespository refreshTokenRespository, |
| | 18 | 11 | | IUserRepository userRepository, |
| | 18 | 12 | | IAccessTokenService accessTokenService |
| | 18 | 13 | | ) : IRefreshTokenService |
| | | 14 | | { |
| | | 15 | | public async Task<TokenResponseDto> RefreshTokenAsync(string refreshToken) |
| | 4 | 16 | | { |
| | 4 | 17 | | var token = await refreshTokenRespository.GetRefreshToken(refreshToken); |
| | 4 | 18 | | if (token == null || token.IsRevoked || token.Expires < DateTime.UtcNow) |
| | 2 | 19 | | throw new UnauthorizedAccessException("Invalid refresh token"); |
| | 2 | 20 | | var user = await userRepository.GetAsyncById(token.UserId); |
| | 2 | 21 | | if (user == null) |
| | 1 | 22 | | throw new UnauthorizedAccessException("Invalid refresh token"); |
| | 1 | 23 | | var newAccessToken = accessTokenService.GenerateAccessToken(user); |
| | 1 | 24 | | token.Revoke(); |
| | 1 | 25 | | await refreshTokenRespository.SaveRefreshToken(token); |
| | 1 | 26 | | var newRefreshToken = await accessTokenService.GenerateRefreshTokenAsync(user); |
| | 1 | 27 | | return new TokenResponseDto |
| | 1 | 28 | | { |
| | 1 | 29 | | AccessToken = newAccessToken, |
| | 1 | 30 | | RefreshToken = newRefreshToken.Token, |
| | 1 | 31 | | }; |
| | 1 | 32 | | } |
| | | 33 | | |
| | | 34 | | public async Task<bool> RevokeRefreshTokenAsync(string refreshToken) |
| | 1 | 35 | | { |
| | 1 | 36 | | var token = await refreshTokenRespository.GetRefreshToken(refreshToken); |
| | 1 | 37 | | if (token == null || token.IsRevoked) |
| | 0 | 38 | | throw new UnauthorizedAccessException("Invalid refresh token"); |
| | 1 | 39 | | token.Revoke(); |
| | 1 | 40 | | await refreshTokenRespository.SaveRefreshToken(token); |
| | 1 | 41 | | return true; |
| | 1 | 42 | | } |
| | | 43 | | } |
| | | 44 | | } |