Задать вопрос
@smoke_him

Esia/Есиа — Почему не приходит refresh_token?

Здравствуйте, делаю авторизацию через Есиа с помощью OAuth2/OpenIdConnect, и основная задача - получение данных о пользователе, была выполнена, но когда встал вопрос о обновлении access_token'а без повторной аутентификации, то я обнаружил, что refresh_token мне не приходит, в документации на этот счёт сказано лишь то, что нужно указать в параметрах запроса access_type: "offline", что я и сделал, но результата нет. Сталкивался кто с такой же проблемой? Прикрепляю код запроса, то как он выглядит перед отправкой и ответ от сервера
public static async Task OnAuthorizationCodeReceivedHandler(AuthorizationCodeReceivedContext ctx, string clientCertificateHash, Func<AuthorizationCodeReceivedContext, Task> userHandler)
{
    ILogger logger = ctx.HttpContext.RequestServices.GetService<ILogger<EsiaOpenIdConnectHandler>>();
    logger.LogInformation($"Зашли в OnAuthorizationCodeReceivedHandler");
    Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectMessage request = ctx.TokenEndpointRequest;

    string authorizationCode = request.Code;
    string clientId = request.ClientId;
    string scope = string.Join(" ", ctx.Options.Scope);
    DateTimeOffset now = DateTimeOffset.Now;
    string timestamp = now.ToString("yyyy.MM.dd HH:mm:ss") + " " + now.ToString("zzz").Replace(":", string.Empty);
    string state = Guid.NewGuid().ToString();
    string redirectUrl = $"https://{ctx.Request.Host}{ctx.Request.PathBase}{ctx.Options.CallbackPath}";
    string msgBase64 = Base64UrlEncoder.Encode($"{clientId}{scope}{timestamp}{state}{redirectUrl}{authorizationCode}");
    string clientSecret = await EsiaExtensions.Sign(ctx.Options.Backchannel, msgBase64).ConfigureAwait(false);

    _cacheState.Add(state, ctx.Options.StateDataFormat.Protect(ctx.Properties));

    request.ClientSecret = clientSecret;
    request.Scope = scope;
    request.Parameters.Add("timestamp", timestamp);
    request.Parameters.Add("state", state);
    request.RedirectUri = redirectUrl;
    request.Parameters.Add("client_certificate_hash", clientCertificateHash);
    request.GrantType = "authorization_code";
    request.TokenType = "Bearer";
    request.Parameters.Add("access_type", "offline");

    logger.LogInformation("TokenEndpointRequest, детали: {@RequestInfo}", request);

    logger.LogInformation("Редирект на ЕСИА, для получения токена, детали: {@RedirectInfo}", new
    {
        Scheme = ctx.Request.Scheme,
        Host = ctx.Request.Host,
        PathBase = ctx.Request.PathBase,
        Path = ctx.Request.Path,
        CallbackPath = ctx.Options.CallbackPath,
        AuthorizationCode = authorizationCode,
        FormedRedirectUrl = redirectUrl,
    });

    await userHandler(ctx);
}

67d932851a5d2088846514.jpeg
67d9328b2d294709582515.jpeg
  • Вопрос задан
  • 49 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы