Спецификация: 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 с— не поддерживается, удален в OAuth 2.1code tokenиcode token id_token
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для scopeemail), в 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, а профили безопасности — какие правила зависят от профиля тенанта.