1 of 20

Разбираемся с OAuth 2.0 Token Exchange

17 февраля 2022

Один в поле не воин

2 of 20

Ирина Блажина

Корпоративный архитектор X5

Разрабатываю архитектуры безопасных решений

Tg: @A_Blair

Mail: iblazhina@inbox.ru

3 of 20

Темы для�обсуждения

1

Стандарт OAuth2.0 Token Exchange

  • История
  • Ключевые аспекты стандарта

СТР. 7

2

Сценарии использования стандарта

  • Паттерны делегирования

- Запросы

СТР. 11

3

Как безопасно подружить приложения?

  • Internal Token to Internal Token Exchange
  • Демонстрация взаимодействия через сервер KeyCloak

СТР. 15

4

Как построить доверительные отношения с внешним провайдером?

  • Internal Token to External Token Exchange
  • Демонстрация взаимодействия через сервер KeyCloak

СТР. 16

НА СЕГОДНЯШНЕЙ ВСТРЕЧЕ

3

4 of 20

  • Зачем token-exchange вообще нужен?
  • В чем проблема-то?

5 of 20

Микросервисы, шлюзы API, OAuth…

5

Api/ api-gateway

api-1

api-N

.

.

.

Internal

Api/ api-gateway

External

DMZ

OAuth- сервер

JWT

JWT

JWT

JWT

JWT

6 of 20

Теория OAuth 2.0 Token Exchange

7 of 20

История

7

8 of 20

Структура

Типы обмена токенами

Доп. описание параметров и примеры

! Сценарии:

  • Делегирование
  • Имперсонация

! Описание запроса/ответа

Ключевые аспекты стандарта

8

9 of 20

  1. Знаете ли вы, для чего в запросах OAuth2.0 используется параметр "grant-type"? (да/нет)

  • Сколько различных «grant-type» определяется стандартом?

9

10 of 20

Типы взаимодействий

10

Grant Type

Описание

implicit

Implicit Grant

Потенциально устаревший

authorization_code

Authorization Code Grant

+PKCE

client_credentials

Client Credentials Grant

password

Resource Owner Password Grant

Потенциально устаревший

refresh_token

Use Refresh Tokens

urn:ietf:params:oauth:grant-type:token-exchange

OAuth 2.0 Token Exchange

Расширение стандарта

urn:ietf:params:oauth:grant-type:device_code

Device Authorization Grant

Расширение стандарта

urn:ietf:params:oauth:grant-type:jwt-bearer

JWT Bearer token authorization grant type

Расширение стандарта

urn:ietf:params:oauth:grant-type:uma-ticket

User-Managed Access (UMA) 2.0 Grant

Расширение стандарта

urn:ietf:params:oauth:grant-type:saml2-bearer

SAML 2.0 Bearer Assertion Profiles

Расширение стандарта

11 of 20

OAuth 2.0 Token Exchange. Делегирование

11

"client_id": "app-client"

"aud": "api",

"sub": “blair“

"scope": "gw profile email"

"act":

{ "client_id":"api-gateway" },

api-gateway

api

OAuth- сервер

app-client

client_id:api-gateway

grant_type:urn:…:token-exchange

subject_token:eyJhbGciOiJSUzI……

requested_token_type:urn:…:refresh_token

scope:api

"client_id": "app-client"

"aud": "api-gateway",

"sub": “blair“

"scope": "profile email"

Упрощенный пример взаимодействия в рамках 1 зоны/домена.

Стандарт применим и для внешних (междоменных) взаимодействий!

12 of 20

OAuth 2.0 Token Exchange. Имперсонация

12

api-gateway

api

Владелец

данных

Делегирование –

действие выполняется от имени владельца данных.

"sub": “Владелец данных

"act": "api-gateway"

Имперсонация –

Действие выполняется как будто самим владельцем данных.

"sub": “Владелец данных

«may_act": Владелец данных "

Token-exchange

13 of 20

Практика на примере реализации в KeyCloak

14 of 20

Важно!

14

-Dkeycloak.profile.feature.token_exchange=enabled

-Dkeycloak.profile.feature.admin_fine_grained_authz=enabled

Включить функциональность в KeyCloak нужно явно:

15 of 20

Internal Token to Internal Token Exchange

15

1 Запрос на аутентификацию. Ввод пользовательских данных. Имитация через Postman

2. Получение (id), access, refresh токенов.

3. Обращение к ресурсу через шлюз. В запросе передается токен.

4. Token exchange запрос. Обмениваем токен client-application на токен для api-gateway.

5. Получение токена через делегирование.

16 of 20

Internal token to External token exchange*

16

{

    "access_token""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",

    "expires_in"0,

    "refresh_expires_in"0,

    "not-before-policy"0,

    "issued_token_type""urn:ietf:params:oauth:token-type:access_token",

    "account-link-url""http://127.0.0.1:8080/auth/realms/token-exchange/broker/github/link?nonce=f70758a5-f983-41b4-9e25-f0a795779b78&hash=yQjAwSnCYJxRMH3_JKKrilrezrnNsa2IuGek7gZ2jxI&client_id=client-application"

}

17 of 20

Интеграция с ADFS. Настройка провайдера

17

18 of 20

Интеграция с ADFS. Настройка провайдера

18

19 of 20

Интеграция с ADFS. Аутентификация

19

20 of 20

https://datatracker.ietf.org/doc/rfc8693/

https://auth0.com/docs/get-started/applications/application-grant-types#spec-conforming-grants

Полезные ресурсы

20