MyBookmark/Modules.User.Application/TokenGenerator.cs
THE_KONDRAT 7b16d72329 ui and login
mongo => postgres
2024-11-03 16:08:39 +03:00

48 lines
1.7 KiB
C#

using Microsoft.IdentityModel.Tokens;
using Modules.User.Application.Settings;
using Modules.User.Domain.Gateways;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Security.Cryptography;
using System.Text;
namespace Modules.User.Application;
public class TokenGenerator : IRefreshTokenGateway
{
private readonly ushort _length = 128;
public string GenerateRefreshToken()
{
var randomBytes = new byte[_length];
using var rng = RandomNumberGenerator.Create();
rng.GetBytes(randomBytes);
return Convert.ToBase64String(randomBytes);
}
internal string GenerateAccessToken(Domain.Entities.User.User user, Domain.Entities.Account.Session session, JwtSettings jwtSettings)
{
if (jwtSettings.AccessTokenExpireTime < TimeSpan.FromSeconds(10)) throw new Exception("AccessTokenExpireTime must be greater than 10 seconds");
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecurityKey));
var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new List<Claim>
{
new(Constants.AccountIdKey, user.Account.Id.ToString() ?? ""),
new(Constants.SessionIdKey, session.Id.ToString() ?? ""),
};
var tokenOptions = new JwtSecurityToken(
issuer: jwtSettings.Issuer,
audience: jwtSettings.Audience,
claims: claims,
expires: DateTime.UtcNow.Add(jwtSettings.AccessTokenExpireTime),
signingCredentials: signingCredentials);
var token = new JwtSecurityTokenHandler().WriteToken(tokenOptions);
return token;
}
}