Я работаю над созданием поставщика OpenID Connect (OIDC) на основе django-oidc-provider. Я читал спецификацию OpenID Connect Spec и не могу понять, насколько токены доступа уникальны для определенного приложения.
Рассмотрим следующий пример с пользователем Бобом:
Боб хочет войти в приложение A, поэтому он переходит к его интерфейсу и перенаправляется к поставщику OIDC. После аутентификации он перенаправляется (неявный поток) обратно в Приложение A с токеном ID и токеном доступа. Затем он делает запрос по адресу «/ image / 1» к API A со своим токеном доступа. API использует токен доступа, чтобы связаться с поставщиком OIDC и подтвердить личность пользователя как Боба. Затем API возвращает данные в «/ image / 1» для пользователя Боба, если такая информация существует. Боб продолжает отправлять свой токен доступа в API A для любых последующих запросов.
Затем Боб решает, что он хочет получить доступ к API приложения B. Он отправляет B API тот же токен доступа, который он использовал с API A. API B обращается к поставщику OIDC с токеном и подтверждает личность пользователя как Боба. Затем API B возвращает запрошенную информацию для Боба.
Что мешает этому случиться? Я вижу как минимум два возможных решения этого:
- При обращении к конечной точке проверки токенов Google "aud" возвращается параметр. API приложения B должен будет проверить этот параметр, чтобы решить, что токен недействителен для его собственного API?
- Дополнительная область должна быть добавлена при запросе токена, специфичного для поставщика ресурсов, например app-A-api. Затем, когда API проверяет токен, API гарантирует, что токен содержит необходимую область.
Какие из этих или других методов соответствуют спецификации OIDC? Если следует использовать одно из вышеперечисленных, правильно ли я предполагаю, что мне следует добавить новую конечную точку / tokeninfo, которая возвращает область видимости или aud, а не добавлять эту информацию к информации, возвращаемой конечной точкой / userinfo?
Любой вклад приветствуется. Я думаю, что большая часть моей путаницы возникает из-за того, что я не вижу параметра «scope», используемого для делегирования доступа поставщику ресурсов в каких-либо примерах OIDC.