Я изучаю OpenIddict, следуя некоторым их примерам, но я не нашел, как установить токен обновления ответа в файлах cookie и использовать файл cookie для аутентификации. Текущее поведение, которое я заставляю работать, заключается в том, что конечная точка Exchange принимаетrefresh_token в теле запроса и возвращает новые access_token иrefresh_token в теле ответа.
Мне удалось настроить некоторые базовые конечные точки контроллера авторизации, я просто хочу использовать файлы cookie только для http для храненияrefresh_token. Я не могу найти способ изменить это поведение в документе openiddict.
используйте этот код ниже для обработки токена:
public class CustomTokenEndpointHandler : OpenIddictServerEvents
{
public override Task ProcessSignIn(OpenIddictServerEvents.ProcessSignInContext context)
{
var response = context.Transaction.Response;
// Set the refresh token in an HTTP-only cookie
context.HttpContext.Response.Cookies.Append(
"refresh_token",
response.RefreshToken,
new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.Strict,
Expires = DateTimeOffset.UtcNow.AddDays(14)
});
// Remove the refresh token from the response
response.RemoveParameter(OpenIddictConstants.Parameters.RefreshToken);
return Task.CompletedTask;
}
}
Переопределите поведение по умолчанию для чтения токена обновления из файла cookie:
public class CustomTokenExchangeHandler : OpenIddictServerEvents
{
public override async Task ProcessAuthentication(OpenIddictServerEvents.ProcessAuthenticationContext context)
{
// Check if the request is for token exchange and contains a refresh token grant type
if (context.Request.IsTokenRequest() && context.Request.IsRefreshTokenGrantType())
{
// Read the refresh token from the cookie
if (context.HttpContext.Request.Cookies.TryGetValue("refresh_token", out var refreshToken))
{
context.Request.RefreshToken = refreshToken;
}
else
{
context.Reject(
error: OpenIddictConstants.Errors.InvalidGrant,
description: "The refresh token is missing.");
}
}
await base.ProcessAuthentication(context);
}
}
теперь зарегистрируйте дескриптор в файле program.cs
Большое вам спасибо, я пропустил часть обработчика событий в их документе. Код новой версии немного отличается, но я это понял.