Перейти к основному содержимому

Аутентификация

Все IDCloud API (контракты Web & SDK и API) используют OAuth2 с JWT Bearer Grant Type (RFC 7523). Вы генерируете кратковременный JWT assertion на своём бэкенде, обмениваете его на Bearer-токен и используете этот токен в каждом последующем запросе.

Никогда не делайте это на стороне клиента

JWT assertion должен генерироваться исключительно на вашем бэкенде. Никогда не раскрывайте закрытый ключ во фронтенд-коде, мобильных приложениях, репозиториях или журналах.

Получение учётных данных

Прежде чем генерировать токены, вам нужен сервисный аккаунт, выданный Unico. Обратитесь в поддержку Unico и предоставьте:

  • Название сервисного аккаунта (не более 12 символов)
  • Имя, email и телефон ответственного лица (только номера Бразилии, США или Мексики)

Вы получите:

  • Уникальное название аккаунта
  • Tenant ID
  • Базовую полезную нагрузку JWT
  • Файл закрытого ключа (формат .pem)
По одному аккаунту на среду

Используйте отдельные сервисные аккаунты для UAT и Production.

Создание JWT assertion

Assertion — это JWT в компактном формате JWS: {Base64url(Header)}.{Base64url(Payload)}.{Base64url(Signature)}.

Header
{
"alg": "RS256",
"typ": "JWT"
}
Payload
ClaimЗначениеПримечания
iss<account_name>@<tenant_id>.iam.acesso.ioПредоставляется вместе с учётными данными
audhttps://identityhomolog.acesso.io (UAT) или https://identity.acesso.io (Production)Должен совпадать с хостом конечной точки токена
scope*Предоставляет все разрешения
iatВременная метка Unix (в секундах)Время выдачи JWT
expiat + не более 3600Не может превышать 1 час от iat
{
"aud": "https://identity.acesso.io",
"scope": "*",
"iat": 1738086000,
"exp": 1738089600
}
Signature

Подпишите заголовок и полезную нагрузку с помощью RS256 (RSA + SHA-256), используя закрытый ключ .pem, предоставленный Unico.

Не добавляйте лишние claims

Любое поле, не указанное выше (например, sub, jti, nbf), вызовет ошибку 1.2.22. Используйте только перечисленные claims.

Запрос токена

Конечная точка токена одинакова для обоих контрактов:

СредаКонечная точка
ProductionPOST https://identity.acesso.io/oauth2/token
UATPOST https://identityhomolog.acesso.io/oauth2/token
Request
ПараметрЗначение
Content-Typeapplication/x-www-form-urlencoded
grant_typeurn:ietf:params:oauth:grant-type:jwt-bearer
assertionВаш подписанный JWT
curl -X POST https://identity.acesso.io/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
-d "assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."
Response
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600
}
ПолеТипОписание
access_tokenstringJWT токен доступа. Используйте в Authorization: Bearer <token> во всех вызовах API.
expires_inintegerВремя истечения срока действия в секундах. Пример: 3600.
token_typestringВсегда Bearer.

Использование токена

Добавьте токен в заголовок Authorization каждого API-запроса. Заголовок одинаков для обоих контрактов — различается только хост и путь вызываемого API:

КонтрактProduction-хостUAT-хост
Web & SDKhttps://api.idcloud.unico.apphttps://api.idcloud.uat.unico.app
APIhttps://api.id.unico.apphttps://api.id.uat.unico.app

Web & SDKAuthorization — единственный необходимый заголовок аутентификации:

curl -X POST https://api.idcloud.unico.app/client/v1/process \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{ ... }'

APIAuthorization используется вместе с заголовком APIKEY:

curl -X POST https://api.id.unico.app/processes/v1 \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "APIKEY: $API_KEY" \
-H "Content-Type: application/json" \
-d '{ ... }'

Обновление токена

Токены истекают через 3600 секунд. Реализуйте упреждающее обновление на своём бэкенде:

  • Отслеживайте expires_in из ответа с токеном и сохраняйте временную метку истечения.
  • Запрашивайте новый токен, когда до истечения остаётся 10 минут или меньше.
  • Никогда не ждите 401 в production для запуска обновления.

Справочник API

Полная спецификация OpenAPI для конечной точки токена доступна в authentication.yaml.

МетодПутьОписание
POST/oauth2/tokenОбмен подписанного JWT assertion на Bearer токен доступа

Коды ошибок

КодОписаниеДействие
1.0.1ID, указанный в iss, некорректенУбедитесь, что поле iss совпадает с Tenant ID, предоставленным при генерации закрытого ключа
1.0.14Приложение неактивноУточните у менеджера проекта, активно ли используемое приложение
1.1.1Параметр scope не указанДобавьте "scope": "*" в полезную нагрузку JWT
1.2.4JWT assertion недействителенJWT assertion более не действителен. Две причины: (а) текущее время превышает exp (JWT действительно истёк — генерируйте новый assertion для каждого запроса токена); или (б) exp превышает iat + 3600 (срок действия слишком долгий — ограничьте exp значением iat + 3600).
1.2.5Ошибка валидации JWTJWT не удалось проверить. Проверьте параметры и убедитесь, что он подписан с помощью RS256 и правильного закрытого ключа
1.2.6Закрытый ключ более недействителенЗакрытый ключ, использованный для подписи JWT, больше не принимается. Запросите новые учётные данные для аккаунта
1.2.7JWT уже использованJWT больше не принимается, так как уже был использован. Генерируйте новый assertion для каждого запроса токена
1.2.11Аккаунт неактивенИспользуемый аккаунт неактивен
1.2.14Аккаунту не хватает необходимых разрешенийИспользуемый аккаунт не имеет необходимых разрешений
1.2.18Аккаунт временно заблокированАккаунт временно заблокирован из-за превышения числа неудачных попыток аутентификации
1.2.19Несанкционированное олицетворение пользователяJWT содержит claim sub, указывающий на аккаунт, которому не разрешено олицетворение. Удалите claim sub из полезной нагрузки.
1.2.20Ошибка декодирования JWTНе удалось декодировать JWT. Проверьте формат токена и убедитесь, что он подписан с помощью RS256.
1.2.21Неверный закрытый ключ / Ошибка аутентификацииПодпись JWT не удалось проверить ни одним из известных ключей для этого аккаунта. Убедитесь, что вы используете правильный закрытый ключ .pem для данного сервисного аккаунта и среды.
1.2.22Недопустимые поля в полезной нагрузкеJWT содержит лишние поля, которые не разрешены. Удалите все claims, не указанные в этом руководстве (например, sub, jti, nbf). Примечание: если вы включили claim sub и получили ошибку 1.2.19, эта ошибка имеет приоритет.
1.3.1Ограничение доступа по IPВаш IP не включён в список разрешённых для этого аккаунта
1.3.2Ограничение доступа по времениЗапрос выполнен вне допустимого временного окна для этого аккаунта

Что дальше