Разъяснение по id_token vs access_token
Я строю систему с OIDC и OAuth 2.0 (используя Auth0), и я не уверен, как правильно использовать id_token
и access_token
. Вернее, я смущен тем, какие роли назначать различным службам в моей настройке.
У меня есть полностью статическое приложение-интерфейс (одностраничное приложение, HTML + JS, без бэкэнд), которое гарантирует, что пользователь аутентифицируется с использованием неявного потока с Auth0. Интерфейс-приложение затем извлекает данные из API, который я также создаю.
Теперь, что правильно?
- Frontend SPA является клиентским приложением OAuth
- Моя служба API - это сервер ресурсов OAuth
...или же:
- Интерфейс и мой API-сервис - это как клиентское приложение
Если и мой интерфейс, и бэкэнд-API можно считать клиентом, я не вижу реального вреда в использовании id_token
в качестве токена-носителя на запросах моего интерфейса на моем бэкэнд - это привлекательно, потому что тогда я могу просто проверить подписанный токен на бэкэнд, и у меня есть вся информация о пользователе, который мне нужен. Однако, если мой API считается сервером ресурсов, я должен, вероятно, использовать access_token
, но тогда мне нужно подключиться к серверам Auth0 по каждому запросу API, чтобы проверить токен и получить базовую информацию о пользователе, не так ли?
Я прочитал это, что, похоже, предполагает, что access_token
является единственным допустимым токеном для использования с моим API. Но, как я уже сказал, я не уверен в роли отдельных услуг. И использование id_token
заманчиво, потому что он не требует сетевых подключений на бэкэнд и содержит информацию, необходимую для извлечения правильных данных.
Каков правильный путь?
Ответы
Ответ 1
Ваш фронтент является вашим клиентским приложением OAuth, как только он хранит токен и может принимать действия в потоке OAuth. И ваш сервис API - это ресурс, потому что он принимает access_token, выданный вашим сервером идентификации.
Также я бы сказал, что ваш id_token означает идентификацию зарегистрированного пользователя и может содержать конфиденциальные данные для вашего приложения. Access_token стоит в качестве ваших учетных данных для доступа к ресурсу.
В конце вы будете использовать access_token для запроса ресурса, а если вам нужны конкретные данные от зарегистрированного пользователя (владельца ресурса), вы можете запросить маркер ID из конечной точки маркера.
Ответ 2
На мой взгляд, первый подход правильный. Ваш SPA - это клиентское приложение, а ваши API - серверы ресурсов.
Я предлагаю вам ограничить использование id_token до вашего SPA. Вы можете использовать основную информацию, присутствующую в токене id (например, имя пользователя и адрес электронной почты), чтобы отображать информацию пользователя в пользовательском интерфейсе. Если вы также можете генерировать токены доступа как JWT, ваш API может проверять токены доступа, не обращаясь к поставщику удостоверений. Вы можете включать роли (или аналогичные) в токен доступа, чтобы получить информацию авторизации в своем токене доступа.