source: iknow-api/Services/Implementations/AuthService.cs@ 89eb129

Last change on this file since 89eb129 was c155364, checked in by imbrsk <boris696boris@…>, 11 months ago

added remaining methods to refreshtoken feature

  • Property mode set to 100644
File size: 4.0 KB
RevLine 
[5b42c8d]1using System.IdentityModel.Tokens.Jwt;
2using System.Security.Claims;
3using System.Text;
4using BCrypt.Net;
[3347c1b]5using iknow_api.Services;
[e49c3ed]6using iknow_api.Models;
[277bd72]7using iknow_api.DTOs;
8using iknow_api.Repositories;
[5b42c8d]9using Microsoft.IdentityModel.Tokens;
10
[277bd72]11namespace iknow_api.Services
[5b42c8d]12{
13 public class AuthService : IAuthService
14 {
15 private readonly IUserRepository _userRepository;
[c155364]16 private readonly IRefreshTokenRepository _refreshTokenRepository;
[3347c1b]17 private readonly IRefreshTokenService _refreshTokenService;
[5b42c8d]18 private readonly IConfiguration _configuration;
19
[c155364]20 public AuthService(IUserRepository userRepository, IConfiguration configuration
21 , IRefreshTokenService refreshTokenService, IRefreshTokenRepository refreshTokenRepository)
[5b42c8d]22 {
23 _userRepository = userRepository;
24 _configuration = configuration;
[3347c1b]25 _refreshTokenService = refreshTokenService;
[c155364]26 _refreshTokenRepository = refreshTokenRepository;
[5b42c8d]27 }
28
[c7d4a59]29 public async Task<bool> RegisterAsync(RegisterDto registerDto)
[5b42c8d]30 {
[c7d4a59]31 if (await _userRepository.UserExistsAsync(registerDto.Email))
[5b42c8d]32 return false;
33
34 var user = new User
35 {
[c7d4a59]36 Name = registerDto.Name,
37 Surname = registerDto.Surname,
38 Index = registerDto.Index,
39 Email = registerDto.Email,
40 PasswordHash = BCrypt.Net.BCrypt.HashPassword(registerDto.Password),
41 Bday = DateTime.SpecifyKind(registerDto.Bday, DateTimeKind.Utc),
42 CreatedAt = DateTime.UtcNow,
[e49c3ed]43 Role = (Models.UserRole)registerDto.Role
[5b42c8d]44 };
45
46 await _userRepository.AddUserAsync(user);
47 return true;
48 }
49
[3347c1b]50 public async Task<AuthResultDto?> LoginAsync(LoginDto loginDto)
[5b42c8d]51 {
[c7d4a59]52 var user = await _userRepository.GetUserByUsernameAsync(loginDto.Email);
53 if (user == null || !BCrypt.Net.BCrypt.Verify(loginDto.Password, user.PasswordHash))
[5b42c8d]54 return null;
55
[3347c1b]56 var result = new AuthResultDto
57 {
58 AccessToken = CreateToken(user)
59 };
60
61 if (loginDto.GenerateRefreshToken)
62 {
[c155364]63 int userid = _userRepository.GetUserByUsernameAsync(loginDto.Email).Id;
64 result.RefreshToken = await _refreshTokenService.GenerateRefreshToken(userid);
[3347c1b]65 }
66
67 return result;
[5b42c8d]68 }
69
70 public async Task<int> GetUsersCountAsync()
71 {
72 return await _userRepository.GetUsersCountAsync();
73 }
74
[c155364]75 public async Task<AuthResultDto> GenerateNewJWT(VerifyRefreshTokenDto token)
76 {
77 int userid = await _refreshTokenRepository.GetUserId(token.token) ?? 0;
78 User user = await _userRepository.GetOnlyUserByIdAsync(userid);
79
80 var result = new AuthResultDto
81 {
82 AccessToken = CreateToken(user)
83 };
84
85 return result;
86 }
87
[5b42c8d]88 private string CreateToken(User user)
89 {
90 var claims = new[]
91 {
92 new Claim("id", user.Id.ToString()),
[e49c3ed]93 new Claim("email", user.Email ?? string.Empty),
[c7d4a59]94 new Claim("role", user.Role.ToString())
[5b42c8d]95 };
96
97 var keyString = _configuration["Jwt:Key"];
98 if (string.IsNullOrEmpty(keyString))
99 throw new Exception("JWT Key is missing in configuration!");
100
101 var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(keyString));
102 var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
103
104 var token = new JwtSecurityToken(
[c7d4a59]105 issuer: "iknow-api",
106 audience: "iknow-api",
[5b42c8d]107 claims: claims,
[c7d4a59]108 expires: DateTime.UtcNow.AddHours(1),
[5b42c8d]109 signingCredentials: creds
110 );
111
112 return new JwtSecurityTokenHandler().WriteToken(token);
113 }
114 }
115}
Note: See TracBrowser for help on using the repository browser.