Использование openid-connect для аутентификации spa и rest api

У меня есть API-сервер (сервер ресурсов) и несколько приложений, веб-интерфейс (SPA) и клиент для настольных компьютеров, и, возможно, еще больше. Я хотел бы использовать openid-connect помимо http-аутентификации для моего API-сервера. Должно быть настроено, какой поставщик openid использовать. Мой собственный, Facebook, Google... Я только хочу сделать аутентификацию, мне не нужно их API. Мне нужны только некоторые данные профиля, такие как электронная почта или имя.

Допустим, я настроил Google в качестве своего IdP, и в настоящее время я использую свой веб-интерфейс (SPA). Мне нужно войти, без проблем, в соответствии с https://developers.google.com/identity/protocols/OpenIDConnect Я перенаправляю пользователя в Google, получаю код авторизации, а веб-интерфейс (SPA) получает id_token и access_token от Google.,

Пока проблем нет, но теперь SPA должен работать с моим API-сервером, а API-серверу необходимо проверять подлинность каждого запроса (так как это API без сохранения состояния), поступающего от клиента (WebGui SPA), и ему необходимо знать, какой пользователь на самом деле это сделал. этот.

То есть access_token от Google предназначен для доступа к google API, верно? Но я также мог бы просто передать этот access_token с каждым запросом моему api-серверу, и сервер api вызывает https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=xxx чтобы проверить access_token и получить имя учетной записи (mail). Но это звучит неправильно, не так ли?

В

У меня также есть и id_token, который я могу проверить, не вызывая сервер Google каждый раз. Так мог ли я просто передавать id_token в качестве носителя с каждым запросом на мой сервер api, и сервер api мог проверить id_token? Но согласно спецификации openid-connect access_token - это тот, который просто передается на сервер API, и id_token должен оставаться на клиенте. Но тогда id_token был бы совершенно бесполезен для меня, сервер API должен знать, кто пользователь, клиент (Web GUI) на самом деле не заботится.

С

Или, поскольку это мой собственный API-сервер, действительно ли мой API-сервер должен сам реализовать всю систему oauth2, только не аутентификацию, а создание access_token и многого другого. Таким образом, у меня будет / api / tokensign, которому я могу передать id_token из Google, API проверяет id_token и создает access_token для моего Web GUI (SPA). И этот новый access_token может быть передан в качестве носителя для каждого запроса API. На самом деле это звучит как лучшее решение в соответствии со спецификациями, но нужно ли мне самому внедрять oauth2 в мой API? Звучит как сложное дополнение, так как A и B также могут быть реализованы.

Мой rest-api нуждается в аутентификации с каждым запросом, так ли A, B, C - правильный подход? Пожалуйста, не говорите мне, что это основано на мнении, это не так. Как правильно использовать oauth2/openid-connect для аутентификации?

1 ответ

Решение

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

Сценарий - две системы S1, S2

  • S1 - провайдер идентификации
  • S2 - конечная точка API

Что вам нужно - доверяйте и используйте "токены", выпущенные S1 для доступа к S2

Пояснения к предлагаемым решениям A, B и C

A - Проверять токены, выданные S1 для каждого звонка

Это можно сделать с помощью конечной точки самоанализа токена RFA7662 - OAuth 2.0. Эта проверка действительна по спецификации, поэтому вы можете использовать конечную точку проверки токена.

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

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

B - доверенные токены, выданные S1 для каждого вызова

Теперь этот подход расширен от RFC6750 - OAuth 2.0 Authorization Framework: использование токенов на предъявителя. Вы действительно можете использовать ID Toke для аутентификации и авторизации конечного пользователя. Эта ссылка содержит хорошее объяснение использования токена ID в качестве токена на предъявителя.

Вы действительно можете проверить действительность токена, используя MAC и даже шифрование. Но будьте внимательны, чтобы использовать краткосрочные токены и всегда использовать TLS. И будьте внимательны при обновлении токенов. Поскольку согласно спецификации openID connect, токен ID не является обязательным элементом для запроса токена обновления.

C - Обертка для федерации

Для этого вы можете написать собственное решение или использовать существующие решения (например:- сервер идентификации WSO2). Этот идентификационный сервер будет настроен для выбора провайдера идентификации в вашем приложении (клиент, например, приложение для настольного компьютера или веб-приложение) Identity Server будет выполнять необходимые перенаправления и предоставлять вам необходимые токены. Но на самом деле вам нужно будет использовать конечную точку самоанализа для проверки правильности токена.

Если вы идете на шаг впереди этого решения, вы можете попытаться реализовать механизм обмена кодом. Вы можете обменять перенос токенов с внешних на токены, выпущенные одной из ваших систем (например:- токен доступа Google на ваш токен внутреннего доступа). Преимущество этого подхода в том, что вы можете контролировать валидацию. Кроме того, поскольку последующие проверки токенов выполняются внутри, должно быть улучшение производительности.

Надеюсь, это объясняет некоторые ваши сомнения.

Другие вопросы по тегам