Пытаюсь сделать аутентификацию на основе JWT-токенов. Сервер - asp.net core 8 web api, клиент - ReactJS. Отправляют по fetch'ем.
Вот часть конфигурации проекта (Сразу после регистрации dbContext):
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
string key = builder.Configuration["JwtOptions:Key"];
byte[] byteKey = Encoding.UTF8.GetBytes(key);
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = false,
ValidateAudience = false,
IssuerSigningKey = new SymmetricSecurityKey(byteKey),
ValidateIssuerSigningKey = true
};
});
services.AddAuthorization();
В той же конфигурации настройка Cors:
services.AddCors(options =>
{
options.AddPolicy("AllowTeachToolClient",
builder =>
{
builder.WithOrigins("http://localhost:3000");
builder.AllowAnyHeader();
builder.AllowAnyMethod();
});
});
// ...
var app = builder.Build();
app.UseCors("AllowTeachToolClient");
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
Тестовый контроллер для проверки аутентифицированных запросов:
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
[HttpGet]
[Route("TestAction")]
public async Task<IActionResult> TestAction()
{
return Ok(new { success = true });
}
}
Запрос на React:
const testPostAction = async () => {
let headers = new Headers({
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVjMzM2MGIxLTk3NjctNDdkYS1iODliLWRkOTE1ZmNkZTNkNyIsImZpcnN0IG5hbWUiOiJOaWsiLCJsYXN0IG5hbWUiOiJGYXJhZGF5IiwibWlkZGxlIG5hbWUiOiJtaWRkbGUiLCJlbWFpbCI6Im15TWFpbEBnbWFpbC5jb20iLCJsb2dpbiI6IkxPR0lOIiwicGhvbmUiOiJteVBob25lIn0.gi5l7dB-rGTIH_5fWB8li4KxS_pYs1-xTX1xJ51kuIQ",
"Access-Control-Allow-Origin": "https://localhost:3000"
})
console.log(headers);
let response = await fetch('https://localhost:7155/api/Test/TestAction', {
headers: headers
})
console.log(response)
let data = await response.json()
console.log(data)
}
При отправке запроса получаю ответ HttpStatusCode 401 (Cors). Более детально:
GET https://localhost:7155/api/Test/TestAction 401 (Unauthorized)
...
body: (...)
bodyUsed: true
headers: Headers {}
ok: false
redirected: false
status: 401
statusText: ""
type: "cors"
url: "https://localhost:7155/api/Test/TestAction"