Спецификация: Financial-grade API: JWT Secured Authorization Response Mode for OAuth 2.0 (JARM)
JARM переносит все параметры ответа авторизации — как успешного, так и с ошибкой — в единый подписанный JWT response, чтобы клиент мог отличить ответ, сформированный этим сервером, от собранного злоумышленником на редиректе.
Режимы ответа
-
query.jwt(§2.1) — ответы code-flow, подписанный JWT в query-строке -
fragment.jwt(§2.1) — ответы сid_token, подписанный JWT во фрагменте - Сокращение
jwt(§2.3.4) — разрешается вquery.jwtилиfragment.jwtв зависимости от response type, так же как уже разрешаются обычныеquery/fragment -
response_modeсохраняется вместе с conversation авторизации — ответ, сформированный после того, как/authorizeпринял параметр, использует режим, с которым запрос реально начался, а не переопределяет его заново по состоянию, которое могло измениться - Подписанные ответы с ошибкой (§4.3) — отклонённая или неуспешная авторизация тоже возвращается в виде подписанного JWT
response, а не только успешная
JWT ответа
- Claims
iss,aud,exp(§2.1) — идентификатор издателя, запрашивающий клиент и срок действия 5 минут - Каждый параметр ответа передаётся как claim, включая
state;issне дублируется отдельным незащищённым параметром рядом с подписанной копией - Подписывается активным ключом подписи тенанта — §2.2 оставляет выбор алгоритма на усмотрение сервера
- Переопределение алгоритма для конкретного клиента через
authorization_signed_response_alg(§2.2 называет это “MAY”) — не реализовано; все клиенты одного тенанта подписываются одним и тем же активным ключом тенанта, а фактически используемый алгоритм клиент узнаёт изauthorization_signing_alg_values_supportedв discovery-документе либо из заголовковalg/kidсамого JWT, а не регистрируя предпочтение - Зашифрованный ответ (вложенный JWE, §2.3) — не поддерживается; ответы JARM только подписываются, но не шифруются
Метаданные сервера авторизации
-
authorization_signing_alg_values_supported(§4) — вычисляется из реально используемых в развёртывании ключей подписи, поэтому не может разойтись с тем, чем реально подписывается ответ -
response_modes_supportedвключаетjwt,query.jwt,fragment.jwtнаряду с обычнымиquery/fragment
Защита state (s_hash)
s_hash — не часть самого JARM, он определён в FAPI 1.0 Advanced §5.2.2, который требует его везде, где ID Token возвращается в виде detached signature рядом со значением state. Здесь он описан рядом с JARM: обе фичи построены вместе, JARM защищает редирект, s_hash — state внутри токена, идущего вместе с ним.
- Claim
s_hashвключается в ID Token, если запрос авторизации содержал значениеstate(FAPI 1.0 Advanced §5.2.2-4) — левая половина хэшаstate, вычисленного тем же алгоритмом, что и подпись ID Token — та же конструкция, что OIDC Core §3.3.2.11 использует дляc_hash - Вычисляется как в ответе авторизации hybrid-flow, так и в ID Token восстановленной conversation