Аутентификация¶
Доступ к Milkyway защищён по OAuth 2.0 (Client Credentials Grant). Банк-отправитель
получает access token в Keycloak Planet9 и передаёт его в каждом запросе к Milkyway
в заголовке Authorization: Bearer <access_token>.
Эта страница описывает, как банку-отправителю получить и использовать токен в окружениях stage и production.
Получение реквизитов¶
Planet9 при подключении создаёт для вас OAuth-клиента в Keycloak и выдаёт пару
client_id / client_secret. Самостоятельная регистрация клиента не предусмотрена.
- Реквизиты выдаются отдельно для stage и production — это разные realm'ы.
client_secret— секрет: храните его в защищённом хранилище, не коммитьте в репозиторий и не логируйте.- Для смены или отзыва реквизитов обратитесь к команде Planet9.
Окружения¶
Keycloak один на оба окружения; они разделены realm'ами.
| Окружение | Realm | Token endpoint |
|---|---|---|
| stage | planet9-stage |
https://keycloak.ac8o.planet9.ae/realms/planet9-stage/protocol/openid-connect/token |
| production | planet9 |
https://keycloak.ac8o.planet9.ae/realms/planet9/protocol/openid-connect/token |
Полную OIDC-конфигурацию realm'а (endpoints, поддерживаемые алгоритмы, JWKS) можно получить по discovery-URL:
https://keycloak.ac8o.planet9.ae/realms/<realm>/.well-known/openid-configuration
Реквизиты не переносятся между окружениями
client_id / client_secret от stage не работают в production и наоборот.
Используйте realm и реквизиты того окружения, к которому обращаетесь.
Получение токена¶
Запрос на token endpoint своего окружения по grant_type=client_credentials
(пример для stage):
curl -s -X POST \
'https://keycloak.ac8o.planet9.ae/realms/planet9-stage/protocol/openid-connect/token' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials' \
-d 'client_id=<ваш client_id>' \
-d 'client_secret=<ваш client_secret>'
Для production замените realm planet9-stage на planet9.
Ответ:
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI...",
"expires_in": 300,
"token_type": "Bearer",
"scope": "..."
}
Использование токена¶
Передавайте полученный access_token в каждом запросе к Milkyway в заголовке
Authorization:
curl 'https://<milkyway-api>/payments/v1/precheck' \
-H 'Authorization: Bearer <access_token>' \
-H 'Content-Type: application/json' \
-d '{ ... }'
Базовый URL Milkyway API
Адрес Milkyway API для stage и production согласуется при подключении и здесь не приводится — токен из соответствующего realm'а используется против API того же окружения.
Срок жизни и обновление¶
- Access token короткоживущий (см.
expires_in, в секундах). По истечении запросите новый тем же запросом — Client Credentials Grant не использует refresh token. - Кэшируйте токен и переиспользуйте его до истечения; не запрашивайте новый токен
на каждый вызов API. Рекомендуется обновлять токен заранее, с небольшим запасом
до
expires_in.
sequenceDiagram
autonumber
participant S as Банк-отправитель
participant K as Keycloak
participant M as Milkyway
S->>K: POST token (client_credentials)
K-->>S: access_token (+ expires_in)
Note over S: Кэшировать до истечения
S->>M: Запрос + Authorization: Bearer <token>
M-->>S: Ответ
Частые ошибки¶
| Симптом | Вероятная причина |
|---|---|
401 invalid_client от Keycloak |
Неверные client_id / client_secret или обращение не в тот realm (перепутано окружение). |
401 Unauthorized от Milkyway |
Токен истёк, отсутствует заголовок Authorization, либо токен выдан в другом окружении. |
400 unauthorized_client |
Для клиента не включён Client Credentials Grant — обратитесь к команде Planet9. |