source: iknow-api/Services/Implementations/AuthService.cs@ 4e061d8

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

Implement refresh token functionality with associated services and repositories

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