Я нахожусь в процессе разработки системы, которая состоит из следующих частей: - Некоторые службы под шлюзом (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;
});
Вот как я получаю токен доступа:
почтальонский экзамен