#oauth-2.0 #scope #swagger #access-token #connexion
#oauth-2.0 #область видимости #swagger #токен доступа #подключение
Вопрос:
Я пытаюсь понять этот пример аутентификации с OAuth2.0 и застрял в части областей видимости: https://github.com/zalando/connexion/tree/master/examples/swagger2/oauth2
В app.yaml мы определяем «uid» как необходимую область для нашего приложения:
/secret:
get:
summary: Return secret string
operationId: app.get_secret
responses:
200:
description: secret response
schema:
type: string
security:
# enable authentication and require the "uid" scope for this endpoint
- oauth2: ['uid']
В определениях безопасности app.yaml «uid» снова находится в разделе областей и требуется в качестве ответа от x-tokenInfoUrl (который мне нужен).
securityDefinitions:
oauth2:
type: oauth2
flow: implicit
authorizationUrl: https://example.com/oauth2/dialog
x-tokenInfoUrl: http://localhost:7979/tokeninfo
scopes:
uid: Unique identifier of the user accessing the service.
В нашем макетном приложении для tokeninfo (mock_tokeninfo.yaml) мы видим, что возвращается «uid» и что область видимости на самом деле «uid», что мы и хотели.
return {'uid': uid, 'scope': ['uid']}
И, наконец, в mock_tokeninfo.yaml у нас есть «uid» и область в ответе:
responses:
200:
description: Token info object
schema:
type: object
properties:
uid:
type: string
scope:
type: array
items:
type: string
Итак, что я теперь понимаю, так это то, что когда app.py запускается на порту 8080, и я вызываю localhost на порту 8080 с помощью «/ secret», часть безопасности проверяет, что требуется, и видит «uid». Он следует за x-tokenInfoUrl на localhost: 7979, где мы запустили наше приложение mock_tokeninfo, и оно возвращает нам «uid» и область «uid».
Теперь мой вопрос заключается в следующем: теперь у меня есть собственный поставщик удостоверений, и я хотел бы получить доступ к userinfo оттуда. Я изменил x-tokenInfoUrl на что-то вроде этого: https://<my_idp>/<some_paths>/userinfo
и когда я делаю curl вот так: curl -H 'Authorization: Bearer <access_token>‘ https://<IDP>/<some_paths>/userinfo
, это работает, и я получаю ответ, который выглядит следующим образом:
{"mail":"<my_email>",
"name":"<my_name>"}
Теперь, насколько я понимаю, мне нужно будет только изменить «uid», например, на «mail», и он должен вернуть мне мое электронное письмо, но нет: я получаю
403 - forbidden
provided token does not have the required scope
Content-Type: application/problem json
Я не понимаю, почему у меня нет требуемой области видимости — для меня это просто не имеет смысла. Может кто-нибудь, пожалуйста, объяснить, как я могу получить свою информацию от моего поставщика удостоверений? Я также проверил и в своем электронном письме для авторизации с моим идентификатором и секретом говорится, что область видимости <some_keyword> , но это ключевое слово также приводит к 403, как и все остальное.
Ps: Я уже передал свой сертификат поставщику удостоверений, так что это не должно быть проблемой.
Редактировать:
Пожалуйста, помогите мне, вы, умный человек из StackOverflow: (
Я нашел эти «ОБЯЗАТЕЛЬНЫЕ соглашения об именах для областей»: https://opensource.zalando.com/restful-api-guidelines / Но и это не помогло.
Я проверил, действительно ли перенаправлен заголовок, и это было.
Я нашел это утверждение: «Однако, чтобы сделать это явным, вы должны назначить псевдо-разрешение uid в этом случае. Это идентификатор пользователя и всегда доступен как область по умолчанию OAuth2», но опять же — если это псевдо-разрешение, как мне создать обычную область?
В каждом примере, который я нахожу (пример чтения / записи домашних животных является наиболее распространенным), переменные области видимости, похоже, имеют пользовательские имена… (https://swagger.io/docs/specification/authentication/oauth2 /)
Вот документация для раздела «безопасность», возможно, я что-то неправильно понимаю: https://connexion.readthedocs.io/en/latest/security.html
Комментарии:
1. Просто чтобы уточнить: под «Моим собственным поставщиком удостоверений» я имею в виду «SIAM — официальный поставщик удостоверений».
Ответ №1:
Итак, решение наконец найдено. Проблема в том, что документация не была обновлена. Это ссылка на документацию:
https://connexion.readthedocs.io/en/latest/security.html#oauth-2-authentication-and-authorization
И в нем говорится, что:
Свойство sub ответа Token Info будет передано в пользовательском аргументе функции обработчика.
Дальнейшее расследование привело к обнаружению этого сообщения о фиксации connexion-package:
https://github.com/mnylen/connexion/commit/1818c34ecbdd6833a6c8cde61021ece38b59d978
Который обновляет недостаточное описание этой фразой:
Ответ Token Info будет передан в
token_info
качестве аргумента функции обработчика.sub
Свойство ответа Token Info будет передано вuser
аргументе функции обработчика.
Итак, помещаем информацию об «Отсутствии областей видимости» отсюда:
https://swagger.io/docs/specification/authentication/oauth2/
вместе с информацией из сообщения о фиксации мы можем изменить наш пример следующим образом:
app.yaml:
security:
# enable authentication and require the "uid" scope for this endpoint
- oauth2: []
securityDefinitions:
oauth2:
type: oauth2
x-tokenInfoUrl: https://<my_idp>/<some_paths>/userinfo
scopes: {}
И вместо использования «user» мы используем «token_info» в нашей функции:
app.py:
get_secret(token_info):
return token_info
Таким образом, я получил всю информацию, которая была передана нашим поставщиком удостоверений.
Спасибо всем, что подумали со мной 🙂 Надеюсь, вы найдете это полезным.