< Summary

Information
Class: KT.Modules.Security.Core.Application.AccessTokenService
Assembly: KT.Modules.Security
File(s): G:\NetProjects\KeepTrack\src\Modules\KT.Modules.Security\Core\Application\AccessTokenService.cs
Line coverage
100%
Covered lines: 33
Uncovered lines: 0
Coverable lines: 33
Total lines: 55
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GenerateAccessToken(...)100%11100%
GenerateRefreshTokenAsync()100%11100%

File(s)

G:\NetProjects\KeepTrack\src\Modules\KT.Modules.Security\Core\Application\AccessTokenService.cs

#LineLine coverage
 1using KT.Domain;
 2using KT.Modules.Security.Core.Application.Contracts;
 3using KT.Modules.Security.Core.Domain;
 4using KT.Modules.Security.Core.Domain.Ports;
 5using Microsoft.Extensions.Configuration;
 6using Microsoft.IdentityModel.Tokens;
 7using System.IdentityModel.Tokens.Jwt;
 8using System.Security.Claims;
 9using System.Text;
 10
 11namespace KT.Modules.Security.Core.Application
 12{
 313    internal class AccessTokenService(IConfiguration configuration, IRefreshTokenRespository refreshTokenRespository) : 
 14    {
 15        public string GenerateAccessToken(User user)
 216        {
 217            var jwtSettings = configuration.GetSection("Jwt");
 218            var key = Encoding.UTF8.GetBytes(jwtSettings["Key"]!);
 19
 120            var claims = new[]
 121            {
 122            new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
 123            new Claim(JwtRegisteredClaimNames.Name, user.Username),
 124            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
 125            new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())
 126            };
 27
 128            var creds = new SigningCredentials(
 129                new SymmetricSecurityKey(key),
 130                SecurityAlgorithms.HmacSha256);
 31
 132            var token = new JwtSecurityToken(
 133                issuer: jwtSettings["Issuer"],
 134                audience: jwtSettings["Audience"],
 135                claims: claims,
 136                expires: DateTime.UtcNow.AddMinutes(double.Parse(jwtSettings["AccessTokenExpirationMinutes"]!)),
 137                signingCredentials: creds);
 38
 139            return new JwtSecurityTokenHandler().WriteToken(token);
 140        }
 41        public async Task<RefreshToken> GenerateRefreshTokenAsync(User user)
 142        {
 143            var expires = DateTime.UtcNow.AddDays(double.Parse(configuration["Jwt:RefreshTokenExpirationDays"]!));
 144            var refreshToken = new RefreshToken(
 145                id: Guid.NewGuid().ToString(),
 146                token: Guid.NewGuid().ToString(),
 147                userId: user.Id,
 148                expires: expires
 149            );
 50
 151            await refreshTokenRespository.SaveRefreshToken(refreshToken);
 152            return refreshToken;
 153        }
 54    }
 55}