JWT Secured Authorization Response Mode (JARM) — Versola Docs
VersolaVersola/docs
0.6.2versola.kzGitHub

JWT Secured Authorization Response Mode (JARM)

response_mode=jwt — ответ авторизации возвращается в виде подписанного JWT

Спецификация: 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