Создайте совместимый с OAuth SSO: проблемы с микшированием client_id

Я хочу создать однопользовательское приложение для Google, чтобы участники одного из наших приложений могли использовать все другие приложения без необходимости повторного входа в систему.

Но я не могу найти правильный способ сделать это, я думаю, что я что-то пропустил с помощью метода grant_type = authorization_code и особенно этой части RFC 6749:

(B) Сервер авторизации аутентифицирует владельца ресурса (через пользовательского агента) и устанавливает, предоставляет ли владелец ресурса или отклоняет запрос на доступ к клиенту.

Приложение SSO - это сам клиент OAuth со своим собственным client_id, поэтому, когда пользователь аутентифицируется, SSO получает access_token для пары (SSO, пользователь) и сохраняет его в сеансе SSO для дальнейшего использования.

Поэтому, когда клиенту ("приложение") потребуется access_token, он будет перенаправлен в SSO, который сам запросит авторизационный код с приложением client_id и моим SSO access_token в заголовке авторизации, чтобы узнать, какой пользователь хочет получить доступ к ресурсу.

И вот в чем проблема: мой SSO access_token был создан для SSO client_id, а не для приложения client_id. Таким образом, кажется hacky/invalid использовать access_token, сгенерированный для одного клиента, для идентификации пользователя, который предоставляет другому клиенту доступ к некоторым ресурсам.

Вот (упрощенная) схема для лучшего понимания потока:

 01  User                        Client                        SSO                     OAuth Server 01
 02   +                             +                           +                            +      02
 03   |                             |                           |                            |      03
 04   | User requests resource      |                           |                            |      04
 05   | +-------------------------> |                           |                            |      05
 06   |                             |                           |                            |      06
 07   |                             | Client redirects to SSO   |                            |      07
 08   |                             | +-----------------------> |                            |      08
 09   |                             |                           |                            |      09
 10   |                             |                           |  SSO authenticates user    |      10
 11   |                             |                           | +------------------------> |      11
 12   |                             |                           |                            |      12
 13   |                             |                           |  token stored on SSO side  |      13
 14   |                             |                           | <------------------------+ |      14
 15   |                             |                           |                            |      15
 16   |                             |                           |  SSO requests grant code   |      16
 17   |                             |                           | +------------------------> |      17
 18   |                             |                           |                            |      18
 19   |                             | authorization code returned to client                  |      19
 20   |                             | <----------------------------------------------------+ |      20
 21   |                             |                           |                            |      21
 22   |                             | authorization code exchanged for an access_token       |      22
 23   |                             | +----------------------------------------------------> |      23
 24   |                             |                           |                            |      24
 25   |                             | access_token returned to client                        |      25
 26   |                             | <---------------------------------------------------+  |      26
 27   |                             |                           |                            |      27
 28   | user can access resource    |                           |                            |      28
 29   | <-------------------------+ |                           |                            |      29
 30   +                             +                           +                            +      30

В строке 10 мы предполагаем, что пользователь не выполнил вход в систему, поэтому пользователь вводит свои учетные данные в пользовательском интерфейсе единого входа, и SSO затем вызовет сервер авторизации со своим собственным client_id и grant_type = password, чтобы получить access_token.

В строке 13 access_token присваивается SSO, это access_token, который связывает user_id с SSO client_id, таким образом мы вошли в систему в централизованном приложении, и нам больше не нужно входить в него.

В строке 16, после того как пользователь нажал "авторизовать" для предоставления ресурсов доступа клиента, SSO запрашивает авторизационный код на сервере OAuth от имени пользователя с SSO access_token в заголовке авторизации для идентификации этого пользователя.

В моем потоке SSO access_token идентифицирует пользователя для других клиентов, и я считаю его недействительным. Может кто-нибудь дать мне несколько советов?

+1
источник поделиться
1 ответ

В обычной такой конфигурации не было бы приложения SSO между клиентом и сервером авторизации, но клиенты будут непосредственно интегрироваться в сервер авторизации со стандартным OAuth 2.0, а сервер авторизации будет интегрироваться с некоторым приложением SSO для аутентификации пользователя.

"некоторое приложение SSO" может быть тем, что вы разработали самостоятельно или внешним провайдером, который говорит о стандартизованном протоколе SSO, таком как SAML или OpenID Connect, например, Google или Microsoft.

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос