Identity Server 4, внешние поставщики и веб-API - PullRequest
1 голос
/ 10 марта 2020

Я нахожусь в процессе разработки системы, которая состоит из следующих частей: - Некоторые службы под шлюзом (Ocelot) - Мобильный клиент (iOS) - Identity Server 4

Мобильный клиент не подготовлен пока, поэтому я использую Postman для эмуляции запросов от него. Моя проблема заключается в реализации аутентификации с внешними провайдерами, такими как Google. Это мой первый опыт использования IS 4, поэтому у меня возникли некоторые недоразумения и трудности. Извините, если мой вопрос слишком абстрактный или я что-то упускаю очевидное. Я успешно развернул IS 4, используя все эти учебные пособия, и он правильно работает с потоком паролей: я запрашиваю IS для токена доступа, отправляю учетные данные пользователя, он возвращает токен, и я могу успешно использовать его для доступа к моим методам API.

Ситуация с внешними провайдерами иная. Я просмотрел этот учебник (https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/google-logins?view=aspnetcore-3.1) и некоторые другие и добавил код из него в проект IS. Я могу успешно войти в Google, используя кнопку на той веб-странице IS4, которая идет с шаблоном интерфейса пользователя IS 4 Quickstart. Но нет возможности работать с API. Как я понимаю, в таком рабочем процессе клиентское приложение должно go для токена не для моего IS, как в примере с локальным пользователем, а для провайдера Google Auth. И я эмулировал его с Почтальоном и получил странный access_token, который не имеет данных, и it_token, который содержит имя пользователя, адрес электронной почты и так далее. Я пытаюсь использовать этот id_token с запросами к моему API. Результат всегда 401.

Где я не прав? Как мне строить запросы к API с токеном от Google? Или у меня возникло недопонимание, и должен быть другой поток: клиент идет в IS с указанным c запросом, IS идет в Google, а затем возвращает соответствующий токен Клиенту?

Вот конфигурация аутентификации на стороне приложения Web API:

private void ConfigAuthentication(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
            {
                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;
                options.Audience = "k_smart_api";
            });
}

Вот конфигурация Google-Auth на стороне IdentityServer:

services.AddAuthentication().AddGoogle(opts => {
   opts.ClientId = "My google client Id";
   opts.ClientSecret = "my google client secret";
   opts.SignInScheme = IdentityConstants.ExternalScheme;
   opts.SaveTokens = true;
});

Вот как я получаю токен доступа:

почтальонский экзамен

...