Как я могу получить новый токен доступа OAuth от внешнего провайдера - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь продлить токены доступа OAuth своих внешних провайдеров после истечения срока их действия. Они хранятся в моей базе данных SQL через менеджер входа, как только пользователь вошел в систему с использованием внешнего поставщика.

Токен доступа используется сервером для отправки запросов от имени пользователя (в основном для обновления моей базы данных информацией о внешних провайдерах время от времени).

Я использую .NETCore 3 preview-6 Угловой стартовый проект со встроенным Identity Server (я понимаю, что это предварительный просмотр - но я думаю, что моя проблема больше связана с отсутствием понимания того, что я должен делать!). У меня не было особых проблем с работой оригинального внешнего логина (используя .AddAuthentication().AddOAuth(...)).

Но когда моя служба, использующая предоставленный маркер доступа, получает ответ 401, я не могу понять, как заставить мой сервер молча обновить маркер доступа для пользователя.

Я попытался , используя [Authorize(AuthenticationSchemes = "MyScheme")] на моем контроллере, но внешний провайдер ответил ошибкой CORS. Затем я попробовал HttpContext.ChallengeAsync(...) в своем сервисе, но это, похоже, даже не работало вообще (возможно, это связано с предварительной версией .NETCore?).

Я даже пытался воссоздать код scaffolded, который возвращает new ChallengeResult(...), но я получаю ту же ошибку CORS при вызове из моего API. (Я не уверен, что здесь происходит, когда происходит чёрная магия, чтобы запрос выглядел так, как будто реферер является внешним провайдером.)

TL; DR (фрагмент кода)

В идеале , я пытаюсь заставить работать секцию // TODO:

// This code is inside a Service I have which is called by a Controller action
var user = await _userManager.GetUserAsync(_httpContextAccessor.HttpContext.User);
var accessToken = await _userManager.GetAuthenticationTokenAsync(user, "MyScheme", "access_token");
_client.SetBearerToken(accessToken);

var response = await _client.GetAsync($"{uri}?{_query.ToString()}");
if (!response.IsSuccessStatusCode)    // Just assuming 401 for simplicity
{
    // TODO: renew the access token and try again
}

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

Надеюсь, это имеет смысл, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Спасибо

...