Доступ к потоку авторизации и обновление токенов - PullRequest
0 голосов
/ 09 мая 2019

При использовании кода авторизации промежуточное программное обеспечение, перехватывающее signin-oidc, обменивается кодом авторизации для маркеров доступа или мне нужно делать это программно?Если промежуточное программное обеспечение делает это, то где я могу найти токены доступа и обновления?

Или мне нужно реализовать свой собственный URL и код перенаправления, перехватить возвращенный код и обменять его с токенами доступа, используя RequestAuthorizationCodeTokenAsync?

1 Ответ

0 голосов
/ 09 мая 2019

Нет, вам не нужно реализовывать часть для получения токенов, это обрабатывается обработчиком, но вам необходим обратный вызов для обработки входа, хранения заявок и создания имени входа. Вот примитивный пример того, как получить токены доступа:

EDIT

Я буду использовать Google в качестве примера, потому что у меня есть код под рукой, но OAuth IdentityServer должен быть таким же, поскольку они расширяют OAuthHandler

services.AddAuthentication(options =>
{
   //Add your identity Server schema etc
})
.AddGoogle(options =>
{
    options.SaveTokens = true;
    options.ClientId = Configuration["Google:ClientId"];
    options.ClientSecret = Configuration["Google:ClientSecret"];
})

А в вашем контроллере аутентификации:

[HttpPost("ExternalLogin")]
[AllowAnonymous]
public IActionResult ExternalLogin(string provider, string returnUrl = null)
{
    var redirectUrl = Url.Action(nameof(ExternalLoginCallback), "Account", new { returnUrl });
    var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
    return Challenge(properties, provider);
}

[HttpGet("ExternalLoginCallback")]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string     remoteError = null)
{
    if (remoteError != null)
    {
        throw new Exception($"Error from external provider: {remoteError}");
    }
    var info = await _signInManager.GetExternalLoginInfoAsync();
    if (info == null)
    {
        //It throws here, since there are no tokens 
        throw new Exception("Error: could not find user tokens");
    }

    //Handle the rest of authentication
}

Что происходит? У вас есть кнопка, указывающая на вашего провайдера внешнего входа «Google» в качестве провайдера.

Вы перенаправлены на страницу входа в Google, и вы входите.

Сервер Google перенаправляет вас обратно на ваш домен и / google-signin (по умолчанию скрыто в дескрипторе) с кодом авторизации

Затем обработчик Google использует код авторизации вместе с вашим секретом для получения токенов

Если указать сохранение токенов, в параметрах OAuth токены из ответа будут сохранены. Наряду с некоторыми основными утверждениями, полученными от конечной точки информации пользователя.

Затем вы будете перенаправлены на обратный вызов внешнего входа:

_signInManager.GetExternalLoginInfoAsync();

Получит сохраненные токены.

Итак, чтобы ответить на ваш вопрос. Обработчик позаботится о сохранении токенов (если вы укажете это). И вы можете получить их из signInManger, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...