content-length: 0 date: Sun, 12 апреля 2026 01:37:08 GMT-сервер: Kestrel www-authenticate: Bearer error="invalid_token",error_description="Ключ подписи не был нашел"
Я использовал:
Код: Выделить всё
JwtOptionsSetup:
using EasyPay.Application.DTOs.Auth;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
namespace EasyPay.Application.OptionsSetup
{
public class JwtOptionsSetup : IConfigureOptions
{
private const string SectionName = "Jwt";
private readonly IConfiguration _configuration;
public JwtOptionsSetup(IConfiguration configuration)
{
_configuration = configuration;
}
public void Configure(JwtOptions options)
{
_configuration.GetSection(SectionName).Bind(options);
}
}
}
Код: Выделить всё
JwtBearerOptionsSetup:
using EasyPay.Application.DTOs.Auth;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace EasyPay.Application.OptionsSetup
{
public class JwtBearerOptionsSetup : IConfigureOptions
{
private readonly JwtOptions _jwtOptions;
public JwtBearerOptionsSetup(IOptions jwtOptions)
{
_jwtOptions = jwtOptions.Value;
}
public void Configure(JwtBearerOptions options)
{
options.TokenValidationParameters = new()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = _jwtOptions.Issuer,
ValidAudience = _jwtOptions.Audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOptions.SecretKey))
};
}
}
}
Код: Выделить всё
JwtProvider:
using EasyPay.Application.DTOs.Auth;
using EasyPay.Application.Interfaces;
using EasyPay.Core.Entities;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace EasyPay.Application.Services.Auth
{
public class JwtProvider : IJwtProvider
{
private readonly JwtOptions _jwtOptions;
public JwtProvider(IOptions jwtOptions)
{
_jwtOptions = jwtOptions.Value;
}
public string Generate(User user)
{
var claims = new Claim[]
{
new Claim("userId", user.UserId.ToString()),
new Claim("email", user.Email)
};
var signingCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOptions.SecretKey)), SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(_jwtOptions.Issuer, _jwtOptions.Audience, claims, null, DateTime.UtcNow.AddHours(1), signingCredentials);
string tokenValue = new JwtSecurityTokenHandler().WriteToken(token);
return tokenValue;
}
}
}
Код: Выделить всё
using EasyPay.Application.Interfaces;
using EasyPay.Application.OptionsSetup;
using EasyPay.Application.Services;
using EasyPay.Application.Services.Auth;
using EasyPay.Infrastructure.Database;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;
namespace EasyPay.Application.Exceptions;
public static class ServiceDI
{
public static IServiceCollection AddServices(this IServiceCollection services, IConfiguration configuration)
{
services.AddControllers();
services.AddEndpointsApiExplorer();
services.AddSwaggerGen(option =>
{
option.SwaggerDoc("v1", new OpenApiInfo { Title = "EasyPay API", Version = "v1" });
option.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
In = ParameterLocation.Header,
Description = "Please enter a valid token",
Name = "Authorization",
Type = SecuritySchemeType.Http,
BearerFormat = "JWT",
Scheme = "Bearer"
});
option.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[]{}
}
});
});
services.AddDbContext(options =>
{
options.UseNpgsql(configuration.GetConnectionString("DefaultConnection"));
});
services.AddScoped();
services.AddScoped();
services.AddScoped();
services.AddScoped();
services.AddScoped();
services.AddScoped();
services.AddRouting(options =>
{
options.LowercaseUrls = true;
});
services.ConfigureOptions();
services.ConfigureOptions();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer();
return services;
}
}
Код: Выделить всё
appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=easypay_db;User Id=secret;Password=secret;"
},
"Jwt": {
"Issuer": "EasyPay",
"Audience": "EasyPay",
"SecretKey": "[radacted]"
}
}