Как изменить «области» с помощью Auth2.0 (Connexion, Swagger)

#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
 

Таким образом, я получил всю информацию, которая была передана нашим поставщиком удостоверений.

Спасибо всем, что подумали со мной 🙂 Надеюсь, вы найдете это полезным.