45 lines
1.9 KiB
C#
45 lines
1.9 KiB
C#
using System.IdentityModel.Tokens.Jwt;
|
|
using System.Security.Claims;
|
|
using System.Text;
|
|
using Microsoft.IdentityModel.Tokens;
|
|
|
|
namespace UniVerse.Api.Tests.Helpers;
|
|
|
|
/// <summary>
|
|
/// Генерирует подписанные JWT токены для использования в интеграционных тестах.
|
|
/// Использует те же секрет/издателя/аудиторию (secret/issuer/audience), которые внедряет ApiWebApplicationFactory.
|
|
/// </summary>
|
|
public static class TestJwtFactory
|
|
{
|
|
public const string Secret = "test-super-secret-key-32-chars!!";
|
|
public const string Issuer = "UniVerse-Test";
|
|
public const string Audience = "UniVerse-Test";
|
|
|
|
/// <summary>Создает валидную строку токена JWT (bearer) для заданной роли и идентификатора пользователя.</summary>
|
|
public static string Generate(string role, int userId = 1)
|
|
{
|
|
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Secret));
|
|
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
|
|
|
|
var claims = new[]
|
|
{
|
|
new Claim(ClaimTypes.NameIdentifier, userId.ToString()),
|
|
new Claim(ClaimTypes.Role, role),
|
|
new Claim("sub", userId.ToString()),
|
|
};
|
|
|
|
var token = new JwtSecurityToken(
|
|
issuer: Issuer,
|
|
audience: Audience,
|
|
claims: claims,
|
|
expires: DateTime.UtcNow.AddHours(1),
|
|
signingCredentials: creds);
|
|
|
|
return new JwtSecurityTokenHandler().WriteToken(token);
|
|
}
|
|
|
|
/// <summary>Создает значение заголовка Authorization: "Bearer <token>".</summary>
|
|
public static string BearerHeader(string role, int userId = 1)
|
|
=> $"Bearer {Generate(role, userId)}";
|
|
}
|