< Summary

Information
Class: Anichron.API.Security.JwtFactory
Assembly: Anichron.API
File(s): /home/runner/work/anichron/anichron/src/Anichron.API/Security/JwtFactory.cs
Tag: 228_36821334185
Line coverage
100%
Covered lines: 28
Uncovered lines: 0
Coverable lines: 28
Total lines: 58
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
.ctor(...)100%11100%
Create(...)100%44100%

File(s)

/home/runner/work/anichron/anichron/src/Anichron.API/Security/JwtFactory.cs

#LineLine coverage
 1using Anichron.API.Settings;
 2using Anichron.Core.Domain;
 3using Microsoft.Extensions.Options;
 4using Microsoft.IdentityModel.Tokens;
 5using System.IdentityModel.Tokens.Jwt;
 6using System.Security.Claims;
 7using System.Text;
 8
 9namespace Anichron.API.Security;
 10
 11public interface IJwtFactory
 12{
 13    string Create(User user);
 14}
 15
 16public sealed class JwtFactory : IJwtFactory
 17{
 18    private readonly JwtSettings settings;
 19    private readonly IClock clock;
 20    private readonly IGuidFactory guidFactory;
 21    private readonly SigningCredentials credentials;
 122    private static readonly JwtSecurityTokenHandler tokenHandler = new();
 23
 1224    public JwtFactory(IOptions<JwtSettings> options, IClock clock, IGuidFactory guidFactory)
 1225    {
 1226        settings = options.Value;
 1227        this.clock = clock;
 1228        this.guidFactory = guidFactory;
 29
 1230        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(settings.Secret));
 1231        credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
 1232    }
 33
 34    public string Create(User user)
 1235    {
 1236        var claims = new List<Claim>
 1237        {
 1238            new(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
 1239            new(JwtRegisteredClaimNames.UniqueName, user.Username),
 1240            new(JwtRegisteredClaimNames.Jti, guidFactory.NewGuid().ToString()),
 1241        };
 42
 1243        if (user.MustChangePassword)
 144            claims.Add(new Claim(AppClaimTypes.MustChangePassword, "true"));
 45
 1246        if (user.IsAdmin)
 147            claims.Add(new Claim(AppClaimTypes.IsAdmin, "true"));
 48
 1249        var token = new JwtSecurityToken(
 1250            issuer: settings.Issuer,
 1251            audience: settings.Audience,
 1252            claims: claims,
 1253            expires: clock.GetCurrentInstant().ToDateTimeUtc().AddMinutes(settings.AccessTokenMinutes),
 1254            signingCredentials: credentials);
 55
 1256        return tokenHandler.WriteToken(token);
 1257    }
 58}