CAS OpenID Connect JARM(JWT Secured Authorization Response Mode)完整指南:配置、响应模式与源码解析

发布时间:2026/9/26 8:22:34
CAS OpenID Connect JARM(JWT Secured Authorization Response Mode)完整指南:配置、响应模式与源码解析 后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载导读本文以 Apereo CAS 官方文档《JWT Secured Authorization Response Mode (JARM) - OpenID Connect Authentication》为主体结合仓库源码support/cas-server-support-oidc与support/cas-server-support-oidc-core-api系统讲解如何在 CAS 中以 JWT 形式编码 OIDC 授权响应。读完本文你将掌握如何为依赖方Relying Party启用 JARM、三种响应模式query.jwt、fragment.jwt、form_post.jwt的区别与选型、JWT 响应的签名与加密机制以及cas.authn.oidc.jarm.*配置项的底层实现原理。JARM 是什么用 JWT 加固 OIDC 授权响应JWT Secured Authorization ResponseJARM是 OpenID Connect 的一种扩展机制允许授权服务器Authorization Server不再将授权响应参数如code、state以明文形式逐项返回给客户端而是将它们整体编码进一个 JWT 中。在 CAS 中这意味着授权响应可以像 ID Token 或 Access Token 一样被签名和可选加密后再交付给依赖方。从安全角度看JARM 带来四个核心价值消息完整性Message Integrity签名保证响应内容在传输途中未被篡改发送方认证Sender Authentication依赖方可通过验签确认响应确实由授权服务器CAS签发受众限制Audience RestrictionJWT 携带aud声明可校验响应是否专门发给当前客户端防混合攻击Protection from Mix-up Attacks绑定iss/aud后可有效抵御跨客户端混淆攻击。此外对响应进行加密还能提供机密性Confidentiality防止code、state等参数值在 URL 或日志中被泄露。需要特别说明的是签名/加密策略与 CAS 处理 ID Token、Access Token 的策略完全一致官方文档原文“should quite similar to that of ID tokens or access tokens”底层复用同一套 JWKS 与密码学执行器因此已配置过 OIDC 令牌签名/加密的部署几乎零成本即可启用 JARM。为依赖方启用 JARMresponseMode配置在 CAS 的 JSON 服务注册表中一个OidcRegisteredService可以通过responseMode属性标记为“使用 JWT 授权响应”。官方文档给出的最小配置示例如下{ class: org.apereo.cas.services.OidcRegisteredService, clientId: client, serviceId: https://app.example.org/redirect, name: Sample, id: 1, scopes : [ java.util.HashSet, [ profile, openid ] ], supportedResponseTypes: [ java.util.HashSet, [ code ] ], responseMode: query.jwt }关键字段说明字段作用示例值class必须是OidcRegisteredServiceJARM 仅对 OIDC 依赖方生效org.apereo.cas.services.OidcRegisteredServiceclientId客户端标识同时将作为 JWT 中aud声明的取值来源clientserviceId客户端的 redirect URIJARM 响应将发送到此地址https://app.example.org/redirectsupportedResponseTypes本示例只支持code流程JARM 与授权码流程配合最典型[ code ]responseModeJARM 的开关取值query.jwt、fragment.jwt或form_post.jwtquery.jwt需要强调的是responseMode也可由客户端在授权请求中通过response_mode参数动态指定当服务定义中显式配置了responseMode时CAS 将按该值处理授权响应。启用后CAS 不再返回逐个明文参数code...state...而是只返回一个response参数其值为完整 JWT。JWT 授权响应的内容与 Claims 结构当授权成功时CAS 将授权响应参数打包进 JWT。官方文档给出了一个成功的code授权响应的 JWT Claims 示例{ iss: https://sso.example.com/cas/oidc, aud: client, exp: 1311281970, code: OC-1-..., state: ... }各声明含义如下iss签发者即 CAS 的 OIDC 签发者地址如https://sso.example.com/cas/oidcaud受众即依赖方的clientId用于校验响应只面向该客户端expJWT 过期时间Unix 时间戳由cas.authn.oidc.jarm.expiration控制默认 60 秒详见下文配置章节code本次授权生成的授权码state客户端在授权请求中携带的状态值原样回传用于 CSRF 防护。从源码可以印证上述 claims 的构建过程在 BaseOAuth20JwtResponseModeBuilder.java 中CAS 使用 Nimbus JOSE 的JWTClaimsSet.Builder依次设置issuer取自ctx.getIssuerService().determineIssuer(...)、expirationTime取自 JARM 配置的过期时长、audience取自oidcService.getClientId()随后将授权响应产生的全部参数code、state等通过parameters.forEach(claimsBuilder::claim)逐一写入 claims最后交给ctx.getResponseModeJwtBuilder().build(...)完成签名/加密并输出 JWT 字符串。三种 JWT 响应模式详解CAS 支持三种 JWT 响应模式区别仅在于“把 JWT 塞进 HTTP 响应的哪个位置、用什么方式传给客户端”。官方文档以 tab 形式分别给出了每种模式的行为与 HTTP 示例下面逐一展开并给出对应的源码实现佐证。模式一query.jwtQuery 组件传输query.jwt模式下CAS 将授权响应以 HTTP 302 重定向发送到客户端的 redirect URI并把名为response的参数值为 JWT附加到重定向地址的query 组件?之后HTTP/1.1 302 Found Location: https://app.example.org/redirect?responseeyJraWQiOiJsYWViIiwiYWxnIjoiRVMyN...这是 JARM 最常用的默认模式兼容性最好。源码层面由 OidcResponseModeQueryJwtBuilder.java 实现构建出 JWT 后返回new RedirectView(redirectUrl)与Map.of(response, token)组成的ModelAndViewSpring MVC 据此生成带 query 参数的 302 重定向该构建器的getResponseMode()返回OAuth20ResponseModeTypes.QUERY_JWT。模式二fragment.jwtFragment 组件传输fragment.jwt模式下CAS 同样以 HTTP 302 重定向发送授权响应但response参数JWT被放到重定向地址的fragment 组件#之后HTTP/1.1 302 Found Location: https://app.example.org/redirect#responseeyJraWQiOiJsYWViIiwiYWxnIjoiRVMyN...该模式对单页应用SPA尤其友好fragment 不会随请求发送到服务器因此 JWT 不会出现在服务器访问日志中客户端 JavaScript 可直接从location.hash中读取response。其实现对应 OidcResponseModeFragmentJwtBuilder.java逻辑与query.jwt构建器一致仅返回视图的组件位置不同getResponseMode()返回FRAGMENT_JWT。模式三form_post.jwtHTTP POST 表单传输form_post.jwt模式下CAS 不再使用重定向而是向客户端的 redirect URI 发起 HTTPPOSTresponse参数JWT被编码为 HTML 表单的隐藏字段值页面加载后自动提交auto-submit表单体以application/x-www-form-urlencoded格式传输。该模式适合希望授权响应走 POST 语义、且对 URL 长度敏感的部署场景JWT 通常比明文参数串更长query/fragment 模式可能触碰 URL 长度上限。源码实现见 OidcResponseModeFormPostJwtBuilder.java构建 JWT 后以CasWebflowConstants.VIEW_ID_POST_RESPONSE作为视图名渲染一个自动提交表单模型包含originalUrl与Map.of(response, token)并以 HTTP 200 状态返回getResponseMode()返回FORM_POST_JWT。三种模式对比小结响应模式传输方式参数位置典型场景源码实现类query.jwt302 重定向URL query?response...通用后端回调OidcResponseModeQueryJwtBuilderfragment.jwt302 重定向URL fragment#response...单页应用SPAOidcResponseModeFragmentJwtBuilderform_post.jwtHTML 表单自动提交POST请求体application/x-www-form-urlencoded避免 URL 过长、需要 POST 语义OidcResponseModeFormPostJwtBuilder签名与加密与 ID Token / Access Token 同源的安全机制JARM 生成的 JWT 响应与 CAS 签发的 ID Token、Access Token 使用同一套签名/加密管线其入口是 OidcJwtResponseModeCipherExecutor.java。该类继承自BaseOidcJwtCipherExecutor构造时接收 CAS 的默认 JWKS 缓存LoadingCacheOidcJsonWebKeyCacheKey, JsonWebKeySet与OidcIssuerService其逻辑名称为OpenID Connect Response Mode JWT。这意味着签名CAS 使用其 OIDC 签名密钥JWKS 中的 RSA/EC 私钥或共享 HMAC 密钥对 JWT 响应签名依赖方可用 CAS 的 JWKS 公钥验签加密可选可进一步用依赖方的公钥对 JWT 响应加密保证code、state等参数的机密性密钥管理与 ID Token 共用cas.authn.oidc.jwks.*体系无需为 JARM 单独维护密钥。该执行器有专门的单元测试覆盖见 OidcJwtResponseModeCipherExecutorTests.java可用于验证签名/加密在本地环境的行为。配置参数cas.authn.oidc.jarmJARM 的全局配置通过cas.authn.oidc.jarm.*属性完成官方文档以{% include_cached casproperties.html propertiescas.authn.oidc.jarm %}的形式挂载了完整属性参考。目前核心配置项定义在 OidcJwtAuthorizationResponseModeProperties.java 中并在 OidcProperties.java 中通过jarm字段挂载到 OIDC 属性树。配置属性类型默认值说明cas.authn.oidc.jarm.expiration时长DurationCapable支持如PT60S、5mPT60S60 秒JARM 响应 JWT 的硬超时时间到期后 JWT 失效以application.properties为例# 将 JARM 响应 JWT 的有效期调整为 2 分钟 cas.authn.oidc.jarm.expirationPT2M底层行为可从 BaseOAuth20JwtResponseModeBuilder.getExpirationDate() 验证CAS 读取casProperties.getAuthn().getOidc().getJarm().getExpiration()通过Beans.newDuration(...)将其解析为秒数然后以 UTC 当前时间为基准向后累加得到exp声明的时间戳。需要留意的是该模块通过RequiresModule(name cas-server-support-oidc)声明依赖即只有引入 OIDC 支持模块cas-server-support-oidc时该配置项才生效。源码结构全景JARM 相关类速查若希望深入阅读 JARM 的实现可按以下路径在仓库中定位核心代码响应模式构建器基类BaseOAuth20JwtResponseModeBuilder.javaclaims 组装与过期时间三种模式构建器OidcResponseModeQueryJwtBuilder.java、OidcResponseModeFragmentJwtBuilder.java、OidcResponseModeFormPostJwtBuilder.java签名/加密执行器OidcJwtResponseModeCipherExecutor.java 及同包下的 OidcRegisteredServiceJwtResponseModeCipherExecutor.java配置模型OidcJwtAuthorizationResponseModeProperties.java装配与测试OidcConfiguration.java各 builder 的 Bean 装配入口、OidcJwtResponseModeCipherExecutorTests.java测试用例实战校验清单接入 JARM 时建议按以下清单逐项确认依赖方类型服务定义必须是OidcRegisteredService见上文 JSON 示例并显式配置responseMode为query.jwt、fragment.jwt或form_post.jwt之一模块依赖确认部署已引入cas-server-support-oidc模块否则cas.authn.oidc.jarm.*配置与 JARM 行为均不会生效密钥就绪由于响应 JWT 与 ID Token 共用签名/加密管线需确保 OIDC JWKS 配置cas.authn.oidc.jwks.*已正确就绪依赖方持有可用的验签公钥有效期匹配按需调整cas.authn.oidc.jarm.expiration默认 60 秒确保客户端在回调处理链路中的验签与取码逻辑能在 JWT 过期前完成回调适配query.jwt/fragment.jwt客户端从 URL 的 query/fragment 中解析response参数form_post.jwt客户端需接受自动提交的表单 POST 并从请求体中读取response。至此从依赖方配置、三种响应模式选型到签名/加密与过期策略CAS 的 JARM 能力已完整覆盖可依据上述路径直接在生产环境中落地并继续深入源码排障。赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Apereo CAS OpenID Connect JWT Bearer 授权模式JWT Authorization Grant接入指南Apereo CAS OpenID Connect JWT Bearer 授权模式JWT Authorization Grant接入指南 JWT Beare后端认证鉴权单点登录Spring Authorization Server OIDC支持OpenID Connect完整配置指南Spring Authorization Server OIDC支持OpenID Connect完整配置指南 Spring Authorization Ser后端认证鉴权身份认证Apereo CAS OAuth 客户端 Response Mode 配置指南query、fragment 与 form_post 的完整实现解析Apereo CAS OAuth 客户端 Response Mode 配置指南query、fragment 与 form_post 的完整实现解析 本指南以后端认证鉴权单点登录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询