У меня API на React использует Jwt аутентификацию с Refresh токенами в куки. Refresh токены отправляются на url
https://localhost:7048/api/auth/update-user-access... для получения нового access токена каждые 5 минут.
При регистрации по
https://localhost:7048/api/auth/register приходит ответ с refresh и access токенами:
access-control-allow-credentials:
true
access-control-allow-origin:
https://localhost
content-type:
application/json; charset=utf-8
date:
Mon, 14 Oct 2024 19:27:17 GMT
location:
https://localhost:7048/api/auth/register
server:
Kestrel
set-cookie:
IssuerRefreshToken=8019B0E82524B316A4798B5DC04BBAD63C7171F7C7F5F89351D7EC736CF316B7A5A3ED8E4D4FBDCBAAECEB970E1DC7016F8F968F8063DF4AA4FE2EBAA8EB55B3; path=/; secure; httponly
vary:
Origin
access токен есть,
но refresh токен не сохраняется в cookie:
Middlewares на ASP .NET Core:
var app = builder.Build();
app.UseMiddleware<HandleExceptionsMiddleware>(); // catches all exceptions in app and logging them
//app.UseHttpsRedirection();
//app.UseHsts();
app.UseRouting();
if (app.Environment.IsDevelopment())
{
app.UseCors(builder => builder
.WithOrigins("http://localhost:3000", "https://localhost:3000", "https://localhost:443", "http://localhost:443")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
.SetIsOriginAllowed(origin => true)
);
Console.WriteLine("development environment");
}
//app.UseForwardedHeaders(new ForwardedHeadersOptions
//{
// ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
//});
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
Код регистрации на Javascript:
import { NextRouter } from 'next/router';
export const handleRegistration = async (
username: string,
email: string,
password: string,
router: NextRouter
) => {
// Проверка входных данных
if (!username || !email || !password) {
throw new Error('Все поля должны быть заполнены');
}
const userData = {
username,
email,
password,
};
try {
const response = await fetch('https://localhost:7048/api/auth/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'credentials': 'include',
},
body: JSON.stringify(userData),
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`Ошибка при регистрации: ${errorText}`);
}
const { userId, accessTokenString } = await response.json(); // Сервер возвращает userId и token
localStorage.setItem('userId', userId);
localStorage.setItem('token', accessTokenString);
router.push('/all');
return { userId, accessTokenString };
} catch (error) {
throw new Error('Ошибка при регистрации. Попробуйте снова!');
}
};
В postman у меня получается взять access и refresh токен с
https://localhost:7048/api/auth/register