Как мы можем передать идентичность через несколько прыжков с OpenId Connect / OAuth
В настоящее время мы внедряем единый вход в нашей организации, решили использовать OpenId Connect для нашего протокола аутентификации (в частности, с помощью Gluu).
Проблема, с которой мы сталкиваемся, заключается в передаче идентификатора, который, как мы можем доказать, был аутентифицирован, цепочке бэкэнд-сервисов. Я видел, как люди передают id_token, но из того, что я понимаю, на самом деле это не намерение id_token, а, напротив, предназначено только для первоначального клиента.
Допустим, у нас есть Angular Application, вызывающая связанную службу REST, которую они называют своего рода службой данных. В настоящее время приложение angular перенаправляет не прошедшего проверку подлинности пользователя в Gluu для входа в систему и предоставляет id_token и access_token.
Реализация Gluu заключается в предоставлении непрозрачного access_token. Поэтому, когда мы передаем этот токен из приложения Angular в службу REST, мы возвращаемся к Gluu, чтобы проверить токен, получить информацию о пользователе, связанную с ним (на основе областей, которые использовались с OpenId), и информацию о клиенте. Это все прекрасно работает с первым прыжком.
Проблема возникает при подключении от службы REST к службе данных. Используя поток client_credential, служба REST вызывает Gluu с областью действия для службы данных, чтобы получить новый токен доступа. Однако я не нашел способа обменять оригинальный токен на новый токен, который сохраняет первоначальные утверждения пользователей.
Я видел совет, где люди говорят: "Вы находитесь в доверенном домене, поэтому просто передайте ИД пользователя и поверьте, что они были аутентифицированы". Это не будет работать для нас. Ранее мы использовали схему HMAC, и команды передавали идентификаторы пользователей, которые никогда не проходили аутентификацию, выдавая себя за пользователей без их ведома, поэтому нам нужен способ гарантировать, что пользователь прошел аутентификацию.
Я чувствую, что мне не хватает части головоломки здесь. Каков "правильный" способ сделать это?
1 ответ
Пожалуйста, не передавайте id_token. В спецификации OpenID Connect говорится, что id_token предназначен для использования в клиентском приложении. Я видел эту проблему решенной двумя способами
1) Требовать от клиентского приложения запроса всех требуемых нижестоящих областей, чтобы их токен доступа работал для всех служб, а аудитория содержала правильные службы. Это может быть невозможно в вашей ситуации, но я бы сказал, что это будет самый простой (возможно, не самый лучший) подход.
2) Я ничего не знаю о GLUU, но в спецификации OAuth 2.0 говорится о расширениях, которые могут быть полезны в вашей ситуации. Это просто означает, что в соответствии со спецификацией вы можете определить свой собственный грант, отличный от "кода", "пароля" и "неявного". Я предлагаю вам реализовать специальный грант. Вы можете определить пользовательский фрагмент информации для аутентификации пользователей. Существует еще одна среда OAuth 2.0/OpenID Connect, называемая IdentityServer, с которой я работаю. Даже если это не GLUU, я думаю, что вы сможете следовать этой статье о расширении грантов, потому что в конце дня GLUU и IdentityServer следуют четко определенному протоколу. В статье показано, как расширение разрешений может решить вашу конкретную проблему правильного делегирования аутентификации. Посмотрите здесь. Я надеюсь, что вы можете реализовать нечто подобное с GLUU.