OpenID Connect Core 1.0 — Versola Docs
/docs
До 1.00.7.5versola.ioGitHub

OpenID Connect Core 1.0

Какие возможности OpenID Connect Core 1.0 реализует Versola — flow, ID token, UserInfo, параметры запроса и claims.

Спецификация: OpenID Connect Core 1.0

OpenID Connect добавляет слой идентификации поверх OAuth 2.0. Он вводит ID token, UserInfo endpoint и стандартный набор claims о пользователе.

Статус

Реализован частично. Отмечено пунктов: 38 из 45.

Flow

  • Authorization Code Flow (response_type=code)
  • Hybrid Flow с response_type=code id_token — nonce обязателен, а ответ по умолчанию идет во fragment (HybridFlowSpec)
  • Implicit Flow — не поддерживается, удален в OAuth 2.1
  • Hybrid Flow с code token и code token id_token — не поддерживается, удален в OAuth 2.1

ID token

  • ID token, подписанный как JWT, возвращается в ответе token endpoint и подписан выбранным ключом тенанта (см. RFC 7519)
  • Стандартные claims iss, sub, aud, exp, iat
  • Claim nonce — возвращается из authorization request
  • Claim auth_time — время аутентификации
  • Claim acr — достигнутый Authentication Context Class Reference, определяемый тенантом
  • Claim amr — Authentication Method References (RFC 8176)
  • Claim sid — идентификатор сессии для logout
  • c_hash — хеш code в hybrid flow
  • at_hash — включается, когда вместе с ID token выдан access token
  • s_hash — включается, если запрос содержал state (см. JARM)
  • Claims, следующие из scope (например email для scope email), в ID token не кладутся; они приходят из /userinfo или из параметра claims в члене id_token
  • Зашифрованный ID token (JWE) — не поддерживается

UserInfo endpoint

  • GET и POST /userinfo, токен только в заголовке Authorization (Bearer или DPoP)
  • Ответ в JSON, а при Accept: application/jwt — подписанный JWT
  • sub присутствует всегда
  • Выдача claims по scope (openid, profile, email, address, phone)
  • Параметр claims — принимается запрос, в котором назван только userinfo или только id_token, а также член со значением null
  • Клиентам first-party (без экрана согласия) выдаются claims, названные в claims, сверх выданного scope
  • Локализованные claims (name#fr, name#fr-CA) с откатом к обычному claim
  • Зашифрованный ответ UserInfo — не поддерживается

Параметры authorization request

  • scope=openid — обязателен для запуска OpenID Connect
  • nonce — защита ID token от replay; обязателен, если response_type содержит id_token
  • max_age — сессия старше лимита приводит к повторной аутентификации; токены переносятся, только если входит тот же пользователь
  • prompt — none, login и consent
  • prompt=select_account — принимается, собственного поведения нет
  • acr_values — добровольный запрос: значения, которых не определяют ни тенант, ни Versola, отбрасываются, а acr сообщает, что достигнуто
  • login_hint — подсказка; значение, которое auth не может использовать, игнорируется и не приводит к ошибке
  • id_token_hint — определяет пользователя при повторной аутентификации; просроченный ID token принимается
  • ui_locales — подсказка; не настроенные локали игнорируются
  • claims — явные запросы claims для userinfo и id_token
  • request — подписанный объект запроса, переданный по значению (см. RFC 9101; JarFlowSpec)
  • request_uri — ссылка на pushed authorization request из /par (см. RFC 9126)
  • request_uri с URL, размещенным клиентом — не реализовано; такой URL отклоняется и никогда не загружается
  • display, registration — не реализованы

Стандартные claims (§5.1)

  • sub — идентификатор пользователя
  • email и phone_number, последний хранится и сравнивается в каноническом E.164
  • Claims стандартных scope (profile, email, address, phone) заложены в каталог claims, а любой собственный claim можно привязать к scope
  • Локализованные варианты claims (claim#locale)
  • address — выдается в том виде, в каком сохранен у пользователя, когда выдан scope
  • Вычисление сервером email_verified, phone_number_verified и updated_at — не вычисляются; выдаются, только если оператор сохранил их у пользователя
  • Pairwise-идентификаторы субъекта — не реализованы, хотя документ discovery по умолчанию перечисляет pairwise в subject_types_supported

Discovery

  • GET /.well-known/openid-configuration, где request_parameter_supported и request_uri_parameter_supported равны true (см. RFC 8414)

Управление сессией и logout

  • OpenID Connect Session Management — не реализован
  • RP-Initiated, Front-Channel и Back-Channel Logout — см. OIDC logout

Примечания

  • acr_values, login_hint и ui_locales по замыслу служат подсказками, как допускает спецификация. acr_values все же может привести к ошибке, если определенное значение нельзя обеспечить для известного пользователя.
  • Совпадает ли id_token_signing_alg_values_supported с ключом, которым подписывает тенант, зависит от хранимого документа discovery; значение не выводится из ключа.

Куда смотреть

Справочник OpenAPI описывает спецификации authorize и userinfo, а профили безопасности — какие правила зависят от профиля тенанта.