Перейти к содержимому
CalabДокументация

UserInfo, refresh и revoke

Получить профиль по access token, продлить доступ refresh token и отозвать токен.

Три эндпоинта, которые понадобятся после входа. Все они находятся под issuer пространства:

text
https://id.example.com/oidc/workspaces/0192a000-0000-7000-8000-0000000000aa/{userinfo|token|revoke}

UserInfo

GET или POST /userinfo с access token в заголовке Authorization: Bearer. Токен в query-строке или теле не принимается, query-строка вообще запрещена.

curl -s https://id.example.com/oidc/workspaces/0192a000-0000-7000-8000-0000000000aa/userinfo \
  -H 'Authorization: Bearer calab_oa_TvZdRRrAeU21FG2au71ffTJmnZjhaX536xpn9Kw1S9o'

Ответ:

JSON
{
  "sub": "7qCZMpOp2e-PYx7A9VRiAGUu8o-MF1kgOZG0umGs_HM",
  "name": "Анна Петрова",
  "email": "anna@example.com",
  "email_verified": true
}
ClaimКогда есть
subВсегда; тот же, что в ID token
nameScope profile
email, email_verifiedScope email и адрес подтверждён в Calab

Ошибка — 401 с {"error": "invalid_token"} и заголовком WWW-Authenticate: Bearer error="invalid_token": токен неверен, истёк или доступ отозван.

Refresh

POST /token с grant_type=refresh_token. Аутентификация клиента — та же, что при обмене кода: Authorization: Basic для веб-приложения с сервером, client_id в теле для публичного клиента.

ПараметрЗначение
grant_typerefresh_token
refresh_tokenПоследний полученный refresh token
scopeНеобязательно: подмножество текущих scopes, чтобы сузить доступ
client_idТолько публичные клиенты
curl -s https://id.example.com/oidc/workspaces/0192a000-0000-7000-8000-0000000000aa/token \
  -u 'calab_client_e07JrYTVpGfRYJ0pQaF6yzkME6S9W856DgsKNWOKvgE:calab_os_VWMV4RGIRsisgKhdE7ohFW_QoAdNWS4n9GkM3Ty1kb4' \
  -d grant_type=refresh_token \
  -d refresh_token=calab_or_g7KMt03Mx5dxElMQi0aw3v-eG08Xrqf6Pv9QQNDSjZQ

Ответ — такой же, как при обмене кода: новые access_token, refresh_token и id_token (без nonce). Правила ротации и почему повтор отзывает всю цепочку — в Токены и сроки.

Revoke

POST /revoke (RFC 7009) — когда пользователь выходит из вашего приложения или отключает интеграцию. Тело — форма с параметром token (access или refresh token), аутентификация клиента — как на /token. token_type_hint не нужен: тип определяется по префиксу.

curl -s -o /dev/null -w '%{http_code}\n' \
  https://id.example.com/oidc/workspaces/0192a000-0000-7000-8000-0000000000aa/revoke \
  -u 'calab_client_e07JrYTVpGfRYJ0pQaF6yzkME6S9W856DgsKNWOKvgE:calab_os_VWMV4RGIRsisgKhdE7ohFW_QoAdNWS4n9GkM3Ty1kb4' \
  -d token=calab_or_g7KMt03Mx5dxElMQi0aw3v-eG08Xrqf6Pv9QQNDSjZQ
# 200
  • Отзыв любого токена цепочки (access или refresh) закрывает весь grant: и refresh, и все access token этой цепочки.
  • Ответ — 200 с пустым телом, даже если токен неизвестен, уже отозван или принадлежит другому клиенту (так требует RFC 7009). Ошибку вы получите только при неверной аутентификации клиента (401 invalid_client) или пустом token (400 invalid_request).
  • Revoke закрывает доступ вашего приложения, но не завершает сессию человека в самом Calab.

Браузерные приложения (SPA) и CORS

/token, /userinfo и /revoke отвечают на CORS-запросы только с origins, зарегистрированных у SPA-клиента в «Разрешённые origins». Preflight (OPTIONS) разрешает методы GET, POST и заголовки Authorization, Content-Type; cookies не используются. Discovery и JWKS доступны без Origin всем, а с Origin — только origins действующих SPA-клиентов этого пространства.