Редактировать:
Вот мой вопрос с новой формулировкой:
У меня есть веб-сервер с защищенными конечными точками API - перед использованием их необходимо пройти проверку подлинности в Google. Для этого я реализовал Challenge
и Callback
конечные точки.
Это хорошо работает из браузера с моим веб-интерфейсом SPA. Пользователь перенаправляется на сайт Google для входа, а затем перенаправляется обратно в мое веб-приложение;затем в браузере есть аутентифицированные куки, и веб-приложение может использовать конечные точки для обновления своего состояния.
У меня также есть приложение WPF, которое будет взаимодействовать с веб-сервером. Я хочу, чтобы приложение WPF выполняло те же функции, что и веб-интерфейс: используйте конечные точки веб-API после аутентификации в Google. Соединение между приложением WPF и моим веб-сервером осуществляется через HttpClient.
Моя проблема в том, что я не знаю, как аутентифицировать это соединение HttpClient между приложением WPF и веб-сервером.
Я пытался использовать ту же самую Challenge
конечную точку, но ответ, который я получаю, - это, конечно, HTML-код со страницы входа в Google, так что, думаю, я не могу использовать это с HttpClient ...
Iтакже пытался выполнить проверку подлинности с помощью GoogleApis из приложения WPF и использовать маркер проверки подлинности для установки файлов cookie в HttpClient
, но, по-видимому, это несовместимо.
Как выполнить проверку подлинности подключения HttpClient к веб-API с помощьювнешний поставщик, такой как Google?
Оригинальный вопрос:
Из приложения WPF пользователь аутентифицируется в Google с помощью этого кода:
using Google.Apis.Auth.OAuth2;
...
public void Authenticate()
{
UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
{
ClientId = "myClientId",
ClientSecret = "myClientSecret"
},
new[] { "email", "openid" },
"user",
CancellationToken.None).Result;
}
Это работает, и объект UserCredential
содержит аутентифицированный токен:
Как встроить эту информацию токена в веб-запрос маde с HttpClient
для того, чтобы позвонить моей конечной точке webapi?
Я думаю, что запрос должен включать некоторые куки, чтобы сообщить серверу, что он был аутентифицирован, но я не знаю, какие именно.
Конечная точка на стороне сервера проверяет, что пользователь аутентифицирован с помощью IdentityServer:
var result = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme);
if (result?.Succeeded != true)
{
throw new Exception("External authentication error");
}