Разбираемся с OAuth 2.0 Token Exchange
17 февраля 2022
Один в поле не воин
Ирина Блажина
Корпоративный архитектор X5
Разрабатываю архитектуры безопасных решений
Tg: @A_Blair
Mail: iblazhina@inbox.ru
Темы для�обсуждения
1
Стандарт OAuth2.0 Token Exchange
СТР. 7
2
Сценарии использования стандарта
- Запросы
СТР. 11
3
Как безопасно подружить приложения?
СТР. 15
4
Как построить доверительные отношения с внешним провайдером?
СТР. 16
НА СЕГОДНЯШНЕЙ ВСТРЕЧЕ
3
Микросервисы, шлюзы API, OAuth…
5
Api/ api-gateway
api-1
api-N
.
.
.
Internal
Api/ api-gateway
External
DMZ
OAuth- сервер
JWT
JWT
JWT
JWT
JWT
Теория OAuth 2.0 Token Exchange
История
7
Структура
Типы обмена токенами
Доп. описание параметров и примеры
! Сценарии:
! Описание запроса/ответа
Ключевые аспекты стандарта
8
9
Типы взаимодействий
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 | Расширение стандарта |
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 зоны/домена.
Стандарт применим и для внешних (междоменных) взаимодействий!
OAuth 2.0 Token Exchange. Имперсонация
12
api-gateway
api
Владелец
данных
Делегирование –
действие выполняется от имени владельца данных.
" “ sub": “Владелец данных “
"act": "api-gateway"
Имперсонация –
Действие выполняется как будто самим владельцем данных.
" “ sub": “Владелец данных “
«may_act": Владелец данных "
Token-exchange
Практика на примере реализации в KeyCloak
Важно!
14
-Dkeycloak.profile.feature.token_exchange=enabled
-Dkeycloak.profile.feature.admin_fine_grained_authz=enabled
Включить функциональность в KeyCloak нужно явно:
Internal Token to Internal Token Exchange
15
1 Запрос на аутентификацию. Ввод пользовательских данных. Имитация через Postman
2. Получение (id), access, refresh токенов.
3. Обращение к ресурсу через шлюз. В запросе передается токен.
4. Token exchange запрос. Обмениваем токен client-application на токен для api-gateway.
5. Получение токена через делегирование.
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"
}
Интеграция с ADFS. Настройка провайдера
17
Интеграция с ADFS. Настройка провайдера
18
Интеграция с ADFS. Аутентификация
19
https://datatracker.ietf.org/doc/rfc8693/
https://auth0.com/docs/get-started/applications/application-grant-types#spec-conforming-grants
Полезные ресурсы
20