Unified Identity Management logo figure Unified Identity Management logo figure

Аутентификация системы (OAuth Client Credentials Flow)

Используется когда действие должно быть выполнено от лица системы, а не пользователя.

Примеры:
  • создание нового пользователя по сигналу из ESB

  • вызов API антифрода

Описание механизма
  1. Система делает вызов UIDM для получения системного токена, передает свой идентификатор и секрет

  2. UIDM выдает токен, сообщает время жизни токена

  3. Система сохраняет токен в локальном кеше для использования в вызовах к веб-приложениям

  4. Система выполняет вызовы требуемых веб-приложений, передавая системный токен в заголовке Authorization

  5. Когда время жизни токена истекло или он был отозван (веб-приложение отдало 401 код), получить новый системный токен, начав сценарий заново

Идентификатор системы и секрет назначаются заранее администратором системы UIDM.

Получение токена

Аутентификация выполняется по протоколу OAuth2.0 с передачей параметра grant_type=client_credentials.

В случае успеха в ответе будет сразу возвращен access_token. В случае ошибки ответ будет содержать данные, идентифицирующие произошедшую ошибку.

POST /sso/oauth2/access_token
Host: <sso_host>
Accept: application/json
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&realm=%2Fcustomer&client_id=<client_id>&client_secret=<client_secret>
  • sso_host - базовый адрес сервера WebSSO, например sso.rooxteam.com

  • realm - группа пользователей WebSSO, всегда используется значение %2Fcustomer, которое является uri-encoded значением /customer

  • client_id - идентификатор клиента, соответствующий системе, например antifraud

  • client_secret - пароль клиента

  • grant_type - способ авторизации пользователя, всегда используется значение client_credentials

Альтернативный способ аутентификации через заголовок Authorization

При необходимости вместо параметров client_id и client_secret можно передать заголовок Authorization

POST /sso/oauth2/access_token
Host: <sso_host>
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <credentials>

grant_type=client_credentials&realm=%2Fcustomer
  • sso_host - базовый адрес сервера WebSSO, например sso.rooxteam.com

  • credentials - пара идентификатор_клиента:пароль закодированная с помощью BASE64, например YW50aWZyYXVkOnBhc3N3b3Jk для antifraud:password

  • realm - группа пользователей WebSSO, всегда используется значение %2Fcustomer, которое является uri-encoded значением /customer

  • grant_type - способ авторизации пользователя, всегда используется значение client_credentials

Формат ответа при успешном получении токена

HTTP/1.1 200 OK
{
  "scope": "cid cn givenname sn telephoneNumber user_name",
  "token_type": "JWTToken",
  "expires_in": 1199,
  "access_token": "eyAiYWxnIjogIlJTQUVTX1BLQ1MxX1YxXzUiLCAiY3R5IjogIkpXVCIsICJ0eXAiOiAiand0IiwgImVuYyI6ICJBMTI4Q0JDX0hTMjU2IiB9.AdeMuqJ_b0MluYMqEF5eNn6tIRn3p4BFRdovm50JHT4Wvk96_Q9nS_3saSYceAEpqB0si-vCA9Upbjti0Ac8xnTcBtM1U_TDwVsui2xQNLbVOv94IS2oUffoRh3RX5X-Btmy72QR7jjSFopfKRdidoMyLheo_TEE4u9I7Ozh6xA.9Hkr0_QCA1Dv_CeqYyfVdQ.UsFFCakvWclp1v-Dl3kJaDdBjhedItO_UpXUsZYILSUX83ASCqE6-ktQgL1Q_-ES3jbbcnHwZ5TUtS272kJq9Oxa7qmscgSARGaSDQhCQiX0QWxEnqZ7kDsshQrndZJMA4PkwDILqWPVZPYqRkrEglAjiEiuGh4TziqX7TOH-NMm03k3KvC1wsXK1_XkjMZyjvo5Z72wGWYnoqhdlYeaqLP9EfJRuQMeRFZJHs-p_xy7lo9u2YRGli3DxVDSohMjrYnWvxSQ3GugNF6eZqm9LWjMJceBC51H_MylfFrWBS-oPMzYKK7v2vWKTSwa_nJxjUcp8Qk7tRr4nFdxFvqLMisIow0OOMlprYYTERdJ9AKFLXPRjkRAegALFYitBQVpsQg66CBS9D9Je_0k3RW4litUHerM31jh4E80AchbODiHnIh7-PvRpZ96LsToQ_Om0zp6jIzTZx70zplI3Y9WZIDvGd3dfAYToj0ijuzScJcO3tSLAs3667WJsvmC2f9rK0Zsevq2eVtFEM8gGd7B0g4uKZ1dXtZPb9CKPUPCTwbhtp_7npslSIIUPImKtwcAoytuzJvHMXf4KWHJxYEZxkEOcqOy5FJMcw3GEucdiHqE8CIeEJe21D0ZuIlTITwAmiJvtuMDwkoZLkX-DEpaARIXnkffoiUvob5STH6jegQuIL3PP5YvnWNh-OljTOGgVRvz7GYubRobCAu6hiHxn80jz3UMXeeU27q07FF5zOJwo4dIWwcQuHvkPursHlT_orkQV9y-KpPd67iVCg-_AizO-dW8lW93qRYzAwTB4oNTRuT-n7bVrId5j0Q5lMNMcKGObiu0VCm6kEqFgOCKZMyTpGCF7_Qhnl9mpsuh7u4CL6wMYuxfKxnzjmViAopHHOt3kK8JACTuFQbURXP5O8Y7BmdIBU4s1_4axUlcYd1UFrW6biWvtw6Hg_S70QvkS9uSduJVoCh3VTB97rVbaQ76A_7trvliH--3UgngXY3myINAYYXL637Ok88JiY_javDSCX0AO8iGP1CnHar9hfoA35AvcpoYrTeHd39NWnIljahKn6kozFkN39ABfin6JMLTVJtK1w65eSu2pDPUPGOqVgm1GFjouXBx1sMvetnyCkkXpKjGLhYRenwOUIF3vSQl40N3rQgvEkEdUoPaFUm7yzXMOPqgYfLBR4WIPEVcqZSh5Tm2WJaa10XndJA8QhGQm-q7LP27abNQK0VgM2eqRNbdeq-gxM6zqESPKP53FPU6DZuOVhn1CLu87JGAhyLglWmWxMHHLWLMtMH7GN6cCLUdCw0x1BjVFa5koZ2KHMC9hKy9THy0yVZBx67hvS4GgsbmjRudiizEexezb9y1XWVVu6v5bu9PveVTMec.nZvmJe2V4BGRYxzKr3-DgA"
}
  • scope - список scope разрешенных для использования от имени пользователя, возможные значения задаются конфигурацией

  • token_type - тип выданного токена.

  • expires_in - время до истечения срока действия токена в секундах

  • access_token - выданный access token

Формат ответа сервера после неуспешного автовхода

Если при попытке получения токена прозошла ошибка, WebSSO отправляет её код вместе с описанием:

HTTP/1.1 401 Unauthorized
{
  "error_description": "Client authentication failed",
  "error": "invalid_client"
}
  • error - строковый код ошибки

  • error_description - описание ошибки

Проверка токена

Для получения информации о созданном токене можно использовать метод tokeninfo

GET /sso/oauth2/tokeninfo?access_token=<access_token> HTTP/1.1
Host: <sso_host>
Cache-Control: no-cache
  • sso_host - базовый адрес сервера WebSSO, например sso.rooxteam.com

  • access_token - токен полученный в ответе на шаге Получение токена

Формат ответа для валидного токена

HTTP/1.1 200 OK
{
  "sub": "antifraud",
  "scope": [
    "user_name",
    "sn",
    "cn",
    "telephoneNumber",
    "givenname",
    "cid"
  ],
  "realm": "/customer",
  "roles": [
    "ROLE_SYSTEM"
  ],
  "token_type": "JWTToken",
  "expires_in": 1085,
  "client_id": "antifraud",
  "auth_level": "0",
  "access_token": "eyAiYWxnIjogIlJTQUVTX1BLQ1MxX1YxXzUiLCAiY3R5IjogIkpXVCIsICJ0eXAiOiAiand0IiwgImVuYyI6ICJBMTI4Q0JDX0hTMjU2IiB9.AdeMuqJ_b0MluYMqEF5eNn6tIRn3p4BFRdovm50JHT4Wvk96_Q9nS_3saSYceAEpqB0si-vCA9Upbjti0Ac8xnTcBtM1U_TDwVsui2xQNLbVOv94IS2oUffoRh3RX5X-Btmy72QR7jjSFopfKRdidoMyLheo_TEE4u9I7Ozh6xA.9Hkr0_QCA1Dv_CeqYyfVdQ.UsFFCakvWclp1v-Dl3kJaDdBjhedItO_UpXUsZYILSUX83ASCqE6-ktQgL1Q_-ES3jbbcnHwZ5TUtS272kJq9Oxa7qmscgSARGaSDQhCQiX0QWxEnqZ7kDsshQrndZJMA4PkwDILqWPVZPYqRkrEglAjiEiuGh4TziqX7TOH-NMm03k3KvC1wsXK1_XkjMZyjvo5Z72wGWYnoqhdlYeaqLP9EfJRuQMeRFZJHs-p_xy7lo9u2YRGli3DxVDSohMjrYnWvxSQ3GugNF6eZqm9LWjMJceBC51H_MylfFrWBS-oPMzYKK7v2vWKTSwa_nJxjUcp8Qk7tRr4nFdxFvqLMisIow0OOMlprYYTERdJ9AKFLXPRjkRAegALFYitBQVpsQg66CBS9D9Je_0k3RW4litUHerM31jh4E80AchbODiHnIh7-PvRpZ96LsToQ_Om0zp6jIzTZx70zplI3Y9WZIDvGd3dfAYToj0ijuzScJcO3tSLAs3667WJsvmC2f9rK0Zsevq2eVtFEM8gGd7B0g4uKZ1dXtZPb9CKPUPCTwbhtp_7npslSIIUPImKtwcAoytuzJvHMXf4KWHJxYEZxkEOcqOy5FJMcw3GEucdiHqE8CIeEJe21D0ZuIlTITwAmiJvtuMDwkoZLkX-DEpaARIXnkffoiUvob5STH6jegQuIL3PP5YvnWNh-OljTOGgVRvz7GYubRobCAu6hiHxn80jz3UMXeeU27q07FF5zOJwo4dIWwcQuHvkPursHlT_orkQV9y-KpPd67iVCg-_AizO-dW8lW93qRYzAwTB4oNTRuT-n7bVrId5j0Q5lMNMcKGObiu0VCm6kEqFgOCKZMyTpGCF7_Qhnl9mpsuh7u4CL6wMYuxfKxnzjmViAopHHOt3kK8JACTuFQbURXP5O8Y7BmdIBU4s1_4axUlcYd1UFrW6biWvtw6Hg_S70QvkS9uSduJVoCh3VTB97rVbaQ76A_7trvliH--3UgngXY3myINAYYXL637Ok88JiY_javDSCX0AO8iGP1CnHar9hfoA35AvcpoYrTeHd39NWnIljahKn6kozFkN39ABfin6JMLTVJtK1w65eSu2pDPUPGOqVgm1GFjouXBx1sMvetnyCkkXpKjGLhYRenwOUIF3vSQl40N3rQgvEkEdUoPaFUm7yzXMOPqgYfLBR4WIPEVcqZSh5Tm2WJaa10XndJA8QhGQm-q7LP27abNQK0VgM2eqRNbdeq-gxM6zqESPKP53FPU6DZuOVhn1CLu87JGAhyLglWmWxMHHLWLMtMH7GN6cCLUdCw0x1BjVFa5koZ2KHMC9hKy9THy0yVZBx67hvS4GgsbmjRudiizEexezb9y1XWVVu6v5bu9PveVTMec.nZvmJe2V4BGRYxzKr3-DgA"
}
  • sub - идентификатор клиента;

  • scope - список scope разрешенных для использования от имени пользователя, возможные значения задаются конфигурацией;

  • realm - группа пользователей WebSSO, всегда используется значение /customer;

  • roles - список ролей присвоенных клиенту, для которого создавался токен;

  • expires_in - время до истечения срока действия токена в секундах;

  • client_id - идентификатор клиента;

  • token_type - тип выданного токена;

  • auth_level - выданный уровень авторизации пользователя, всегда 0, игнорируется

  • access_token - выданный access token.

Формат ответа для невалидного токена

Если проверяемый токен указан неверно, либо его срок действия истёк, WebSSO возвращает следующую ошибку:

HTTP/1.1 401 Unauthorized
{
    "error": "expired_token",
    "error_description": "The request contains a token no longer valid."
}
  • error - строковый код ошибки

  • error_description - описание ошибки

Авторизация запросов к веб-приложениям с помощью выданного токена

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

Authorization: Bearer sso_1.0_<access_token>

Примеры вызова

Чтение:

GET /otp-settings-1.0/user/otp/settings/field HTTP/1.1
Host: api.rooxteam.com
Authorization: Bearer sso_1.0_eyAiYWxnIjogIlJTQUVTX1BLQ1MxX1YxXzUiLCAiY3R5IjogIkpXVCIsICJ0eXAiOiAiand0IiwgImVuYyI6ICJBMTI4Q0JDX0hTMjU2IiB9.p5OPKt0JQJ2lRP-vsjWJAxIQ_kUiw8v6BWWowBWQGYXNZDPQM2qUxK7VJZlxlA1Gak4rZWA2LBGEO6Vf-saAvWclrRdt9CDVhFZwWXXEgHa4ZKkWpQALMR6uyFtvw1e3gJYRY6gKFwtO6at7q9RIJKnecBGe-cGq6jqIKGfPv1E.qmKIKTTNyY9jyWaIFBcCeg.i0FNGdOUpZG-yaEwTdSRWyf6mydxB053-o_H3aqENI_lj0ZtkKy9k6aNe0R5uVqDLF_dutuQzQ0baPuFQiltYmnPTwP1DatG1PdmffqVYGn-nPbCtovh6Z2Ub9N2PaGsQZzvkcusYOdXw_Nrecgwu18E7KPuMpp2zSjPp2GUGhX2yHfhExTPpYBlIPjZCOS6GReBCx0QPTdqEhhkcsdiyVfyrzaJ2CUnDKDrzwaiYa3-p0PUii-sNfcgNK73ehT_QeTGQWjzMq7GGp-gV2N-J_Aya_Y-APdawaXU_C_ayyE1ij6OhsHdpeY-o6iRpPPicOqprJRmX4uwZyaO0l6OUXmOXfKOMQCcXNXgovDHpQmdkkKq76FsgfootSXHMEbJlTA8L8abAfQBQOwPgRMha9-0Rl_otmBXJWRSFJ0OowMpyg2--J7ykxLvA74DCIBH9KrSUTPfFK7sPzEBiayrpYS7EEeyNQgTAoRE5SvtPUVkPKF9i5xp2XWRzJqMM58fXL3PYEt2x2NLkrGY6ikJjZwId-qQsuhynL2xzNo7LXyUVKZjunV6uExuHfOhwG7tgf3hOy7ZSP2aBkvKDPgWdJ4Iik-bIHrzqKCViF4l90mboCYdq0-X4x3uA_l64DDh3gI5OukxnCbUmjWQAniNxZrExqvOkGmVVLLjw8Z55QpP9anQt4Yyf9V2s-brroesGK1dRY5PNro6uvQ96pLGVUq-u5NviA5qgjIqHn3SCORfeNRh18Uv2h2FQfrgSfJms-jinngGrnGY62AhUSAiErokLPINAQyOMx2cwvDoX2wwJriyxUBmDaa7A6qaMmSAN82UOiaFcmKgCqVwXP3i_mhGpom1GRCASLoLZhKcrBDmLh0cz-fS7TJV7sorATMAyxXE00Sh9jNZqxamt9SBdX5ufS1eGr-3Jlm1R1dYyIdAw2xNJj8nPqnYV8Zgp2dyzzmbDVF64nCiN5k4EEhvOsrMIPpXJSPbrmeBgOPniY046Pn9f8T7ksw975XQjUjwI2T6STRO473bzTsdWyMWG2s84DS_QU5esOGrHzKuIq_SADvQi1OflqbG1Uwi1sXOj2J6_vepmwutuX48d8ZsfUmbrhPnEN-IOZ0xMjig5A718H7MZ896vUt1hVQXipaujwVciMm-kpF1wi_XP9_OdPdLvaxVxPqGxgGlOjwCoB00B0um5dQ-9Bij0TEjyHeuHDAr98Ae2OW2_R0CqKgUX-HKJGyxnoXgAHm7JFzYUyJY7Q3GymJc3vQBAXsvnus2cCHpNA4RfhyGAYUmMEklq1YWt8a90KV4bcePA0cZ7JEvnp1J1aKtY9PbsRYOXb-TteQ2sad_RWwHEMNntF36D5INPH2tz8feN7bdzn4WjDU.4hX3Djs0r5e754n5vs1ARA

Модификация:

POST /money/transfer/internal/card/tocard HTTP/1.1
Host: api.rooxteam.com
Authorization: Bearer sso_1.0_eyAiYWxnIjogIlJTQUVTX1BLQ1MxX1YxXzUiLCAiY3R5IjogIkpXVCIsICJ0eXAiOiAiand0IiwgImVuYyI6ICJBMTI4Q0JDX0hTMjU2IiB9.p5OPKt0JQJ2lRP-vsjWJAxIQ_kUiw8v6BWWowBWQGYXNZDPQM2qUxK7VJZlxlA1Gak4rZWA2LBGEO6Vf-saAvWclrRdt9CDVhFZwWXXEgHa4ZKkWpQALMR6uyFtvw1e3gJYRY6gKFwtO6at7q9RIJKnecBGe-cGq6jqIKGfPv1E.qmKIKTTNyY9jyWaIFBcCeg.i0FNGdOUpZG-yaEwTdSRWyf6mydxB053-o_H3aqENI_lj0ZtkKy9k6aNe0R5uVqDLF_dutuQzQ0baPuFQiltYmnPTwP1DatG1PdmffqVYGn-nPbCtovh6Z2Ub9N2PaGsQZzvkcusYOdXw_Nrecgwu18E7KPuMpp2zSjPp2GUGhX2yHfhExTPpYBlIPjZCOS6GReBCx0QPTdqEhhkcsdiyVfyrzaJ2CUnDKDrzwaiYa3-p0PUii-sNfcgNK73ehT_QeTGQWjzMq7GGp-gV2N-J_Aya_Y-APdawaXU_C_ayyE1ij6OhsHdpeY-o6iRpPPicOqprJRmX4uwZyaO0l6OUXmOXfKOMQCcXNXgovDHpQmdkkKq76FsgfootSXHMEbJlTA8L8abAfQBQOwPgRMha9-0Rl_otmBXJWRSFJ0OowMpyg2--J7ykxLvA74DCIBH9KrSUTPfFK7sPzEBiayrpYS7EEeyNQgTAoRE5SvtPUVkPKF9i5xp2XWRzJqMM58fXL3PYEt2x2NLkrGY6ikJjZwId-qQsuhynL2xzNo7LXyUVKZjunV6uExuHfOhwG7tgf3hOy7ZSP2aBkvKDPgWdJ4Iik-bIHrzqKCViF4l90mboCYdq0-X4x3uA_l64DDh3gI5OukxnCbUmjWQAniNxZrExqvOkGmVVLLjw8Z55QpP9anQt4Yyf9V2s-brroesGK1dRY5PNro6uvQ96pLGVUq-u5NviA5qgjIqHn3SCORfeNRh18Uv2h2FQfrgSfJms-jinngGrnGY62AhUSAiErokLPINAQyOMx2cwvDoX2wwJriyxUBmDaa7A6qaMmSAN82UOiaFcmKgCqVwXP3i_mhGpom1GRCASLoLZhKcrBDmLh0cz-fS7TJV7sorATMAyxXE00Sh9jNZqxamt9SBdX5ufS1eGr-3Jlm1R1dYyIdAw2xNJj8nPqnYV8Zgp2dyzzmbDVF64nCiN5k4EEhvOsrMIPpXJSPbrmeBgOPniY046Pn9f8T7ksw975XQjUjwI2T6STRO473bzTsdWyMWG2s84DS_QU5esOGrHzKuIq_SADvQi1OflqbG1Uwi1sXOj2J6_vepmwutuX48d8ZsfUmbrhPnEN-IOZ0xMjig5A718H7MZ896vUt1hVQXipaujwVciMm-kpF1wi_XP9_OdPdLvaxVxPqGxgGlOjwCoB00B0um5dQ-9Bij0TEjyHeuHDAr98Ae2OW2_R0CqKgUX-HKJGyxnoXgAHm7JFzYUyJY7Q3GymJc3vQBAXsvnus2cCHpNA4RfhyGAYUmMEklq1YWt8a90KV4bcePA0cZ7JEvnp1J1aKtY9PbsRYOXb-TteQ2sad_RWwHEMNntF36D5INPH2tz8feN7bdzn4WjDU.4hX3Djs0r5e754n5vs1ARA
Cache-Control: no-cache
Content-Type: application/json

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

Примеры ответа

Ответ на успешный запрос:

HTTP/1.1 200 OK
{
  "success" : true,
  "data" : {
    ...
  }
}

Ответ на запрос без токена, либо с истекшим токеном:

HTTP/1.1 401 Unauthorized
{
  "error": {
    "code": 401,
    "message": "Unauthorized"
  }
}

Ответ на запрос с токеном, к запрещённому ресурсу:

HTTP/1.1 403 Forbidden
{
  "error": {
    "code": 403,
    "message": "Access is denied"
  }
}

Формат ответов может отличаться от действительного, для получения подробностей необходимо обратиться к документации WebAPI.

Конфигурация

  • В настройках OAuth2.0 клиента установить свойство clientClaims. Параметр является lookup-таблицей, следует использовать особый синтаксис.

Пример файла конфигурации клиента
clientName=onlinebank_web

clientClaims[0]=propertykey=propertyvalue

Связанные документы

Название документа Описание

rfc6749.pdf

Базовая спецификация протокола OAuth2.0.

rfc7009.pdf

Расширение базовой спецификации протокола OAuth2.0, описывающее token revocation.