Apereo CAS 作为 OAuth 2.0 服务端:协议端点、配置属性与授权流实战指南

发布时间:2026/9/25 18:27:50
Apereo CAS 作为 OAuth 2.0 服务端:协议端点、配置属性与授权流实战指南 后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载本文以 Apereo CAS 官方文档为骨架系统讲解如何将 CAS 部署为 OAuth 2.0 身份提供者Authorization Server从启用cas-server-support-oauth-webflow模块、配置cas.authn.oauth属性族到/oauth2.0/*系列端点的职责、七种协议流程授权码、PKCE、客户端凭证、设备授权、令牌交换、Implicit、刷新令牌、资源所有者以及令牌生命周期与排障手段。读者阅读完本文后将能够独立在 CAS WAR overlay 中开启 OAuth 服务端能力并为第三方应用签发、校验、吊销访问令牌与刷新令牌。OAuth 服务端还是 OAuth 客户端先明确角色本文所述内容特指CAS 作为 OAuth 身份提供者IdP服务器即由 CAS 对外提供/oauth2.0/authorize、/oauth2.0/accessToken等标准端点让第三方应用通过 OAuth 2.0 协议向 CAS 换取令牌。如果你的需求恰好相反——希望 CAS 作为 OAuth/OpenID 客户端去对接 Google、Facebook 等外部提供商则属于委托认证Delegated Authentication范畴请参考 Delegate-Authentication 页面。这两条技术路径在 CAS 中由完全不同的模块承载切勿混淆。启用 OAuth 支持WAR overlay 依赖在 CAS WAR overlay 中OAuth 服务端能力的开关就是一个依赖项。官方文档要求引入cas-server-support-oauth-webflow模块implementation org.apereo.cas:cas-server-support-oauth-webflow该模块位于仓库的 support/cas-server-support-oauth-webflow 目录。从源码结构看它承担了两方面职责Webflow 编排OAuth20WebflowConfigurer 负责把 OAuth 授权流程接入 CAS 的登录 webflow使得用户访问/oauth2.0/authorize时能够走 CAS 统一的认证与 MFA 流程自动装配CasOAuth20WebflowAutoConfiguration 负责 Spring Boot 自动配置的注册与装配。引入该依赖后模块自身还会依赖cas-server-support-oauth核心协议实现与cas-server-support-oauth-core-api协议端点的 Controller 层位于 support/cas-server-support-oauth-core-api/src/main/java/org/apereo/cas/support/oauth/web/endpoints因此无需手动逐个添加这些传递依赖。配置属性cas.authn.oauth属性族所有 OAuth 服务端配置统一挂在cas.authn.oauth前缀之下。对应的配置模型类为 OAuthProperties模块标记为cas-server-support-oauth自 CAS 5.0.0 引入其内部以嵌套对象的方式拆分了若干配置子项UMA 相关配置uma除外由单独的 OAuth-UMA 功能承载。配置前缀对应配置类职责cas.authn.oauth.coreOAuthCorePropertiesOAuth 核心行为审批页跳过、用户画像渲染模式cas.authn.oauth.grantsOAuthGrantsProperties各授权类型如资源所有者的细粒度开关cas.authn.oauth.codeOAuthCodeProperties授权码Authorization Code的存活时间与使用次数cas.authn.oauth.access-tokenOAuthAccessTokenProperties访问令牌的过期策略、JWT 化与加密签名cas.authn.oauth.refresh-tokenOAuthRefreshTokenProperties刷新令牌的过期策略与访问令牌追踪cas.authn.oauth.csrf-cookieOAuthCsrfCookiePropertiesOAuth 认证流程中的 CSRF Cookie 控制cas.authn.oauth.cryptoEncryptionOptionalSigningOptionalJwtCryptographyProperties令牌/密钥的加密与签名密钥设置默认启用 256 位加密、512 位签名密钥尺寸各子项的默认值及典型配置如下配置类源码注释与字段默认值即为依据核心行为core# 是否跳过授权审批consent页面。默认 false即每次都要求用户确认 cas.authn.oauth.core.bypass-approval-promptfalse # 用户画像渲染模式NESTED嵌套默认或 FLAT扁平所有属性摊平到单层 cas.authn.oauth.core.user-profile-view-typeNESTEDuser-profile-view-type直接决定/oauth2.0/profile端点返回 JSON 的结构形态NESTED模式保持属性树状层级FLAT模式则将所有属性压平到一层适合消费端解析逻辑简单的场景。授权码code# 授权码可被使用的最多次数默认 1 次一次性 cas.authn.oauth.code.number-of-uses1 # 授权码的有效时长秒默认 30 秒 cas.authn.oauth.code.time-to-kill-in-seconds30 # CAS 在票据注册中心Ticket Registry中保存 OAuth 授权码的存储对象名 cas.authn.oauth.code.storage-nameoauthCodesCache # 当授权码过期或不存在时是否连带移除相关访问令牌默认 false cas.authn.oauth.code.remove-related-access-tokensfalse授权码默认仅 30 秒有效、只可兑换一次这符合 OAuth 2.0 对授权码作为短期凭证的安全预期。storage-name说明授权码并非保存在内存全局 Map而是作为票据存放在可插拔的 Ticket Registry 中因此生产环境切换 Redis、MongoDB、JDBC 等注册中心后授权码也随之获得持久化与集群共享能力。访问令牌access-token# 访问令牌的硬超时时间绝对过期默认 8 小时ISO-8601 时长格式 cas.authn.oauth.access-token.max-time-to-live-in-secondsPT8H # 访问令牌的滑动窗口空闲超时默认 2 小时 cas.authn.oauth.access-token.time-to-kill-in-secondsPT2H # 是否将访问令牌签发为 JWT默认 false cas.authn.oauth.access-token.create-as-jwtfalse # JWT 访问令牌是否附带 CAS 属性作为 claims默认 true仅当令牌为 JWT 时生效 cas.authn.oauth.access-token.include-claims-in-jwttrue # 访问令牌在 Ticket Registry 中的存储对象名 cas.authn.oauth.access-token.storage-nameoauthAccessTokensCache # 单个应用可同时持有的最大活动访问令牌数0/未设置表示不限制 cas.authn.oauth.access-token.max-active-tokens-allowed0访问令牌过期策略采用硬超时 滑动窗口双参数模型max-time-to-live-in-seconds是绝对上限time-to-kill-in-seconds是空闲超时。若要把访问令牌做成 JWT无状态、可离线校验请参考 OAuth-Authentication-JWT-AccessTokens 页面并注意include-claims-in-jwt与crypto子项的配套设置——JWT 访问令牌的加密/签名密钥在 OAuthAccessTokenProperties 中默认启用 256 位加密密钥与 512 位签名密钥。刷新令牌refresh-token# 刷新令牌的硬过期时间默认 14 天 cas.authn.oauth.refresh-token.time-to-kill-in-secondsP14D # 刷新令牌在 Ticket Registry 中的存储对象名 cas.authn.oauth.refresh-token.storage-nameoauthRefreshTokensCache # 单个应用可同时持有的最大活动刷新令牌数 cas.authn.oauth.refresh-token.max-active-tokens-allowed0 # 是否将刷新令牌签发为 JWT默认 false cas.authn.oauth.refresh-token.create-as-jwtfalse # 刷新令牌是否追踪其签发的访问令牌仅用于历史与审计默认 true cas.authn.oauth.refresh-token.track-access-tokenstruetrack-access-tokens开启后刷新令牌会维护一份由它签发的访问令牌清单只要刷新令牌本身有效这些访问令牌就一直挂在清单上并在过期后按需被清理——该机制纯粹服务于审计与历史追溯不影响令牌的实际校验逻辑。资源所有者授权grants.resource-owner# 资源所有者password授权时是否强制要求通过请求头提供 service 参数 # 以启用按服务的授权策略。默认 false cas.authn.oauth.grants.resource-owner.require-service-headerfalse当require-service-headertrue时使用 Resource Owner 授权类型必须额外通过 HTTP 头传递服务标识CAS 才能依据注册的 OAuth 服务策略执行授权规则——这属于超出 OAuth 2.0 协议本身语义的 CAS 扩展。协议端点总览启用 OAuth 支持后以下端点全部挂载在/oauth2.0基础路径之下。/oauth2.0前缀常量定义于 OAuth20ConstantsBASE_OAUTH20_URL /oauth2.0各端点的authorize、accessToken、token、profile、introspect、device、revoke等路径常量同文件可见。端点说明方法/oauth2.0/authorize授权用户并启动 CAS 认证流程GET/oauth2.0/accessToken、/oauth2.0/token以纯文本或 JSON 形式获取访问令牌POST/oauth2.0/profile通过access_token参数以 JSON 获取已认证用户画像GET/oauth2.0/introspect通过 令牌 introspection 查询给定访问令牌的状态POST/oauth2.0/device通过设备授权流程审批设备用户码POST/oauth2.0/revoke吊销访问令牌或刷新令牌。该端点要求使用 OAuth2 服务的client_id与client_secret作为用户名/密码进行 HTTP Basic 认证POST这些端点在源码中均有对应的 Controller 实现位于 support/cas-server-support-oauth-core-api/src/main/java/org/apereo/cas/support/oauth/web/endpointsController端点映射注解OAuth20AuthorizeEndpointController/oauth2.0/authorizeGetMappingPostMappingOAuth20CallbackAuthorizeEndpointController/oauth2.0/callbackAuthorizeGetMappingOAuth20AccessTokenEndpointController/oauth2.0/accessToken、/oauth2.0/tokenPostMapping另有GetMappingOAuth20UserProfileEndpointController/oauth2.0/profileGetMappingPostMappingOAuth20IntrospectionEndpointController/oauth2.0/introspectGetMappingPostMappingOAuth20DeviceUserCodeApprovalEndpointController/oauth2.0/deviceGetMappingPostMappingOAuth20RevocationEndpointController/oauth2.0/revokePostMapping对应的端点测试位于 support/cas-server-support-oauth/src/test/java/org/apereo/cas/support/oauth/web/endpoints如OAuth20AccessTokenEndpointControllerTests、OAuth20IntrospectionEndpointControllerTests、OAuth20RevocationEndpointControllerTests等可作为端点半段与参数语义的补充验证依据。协议流与授权类型CAS 支持以下协议流、响应类型与授权类型每类流程均有独立专题页流程专题资源Authorization Code / PKCEOAuth-ProtocolFlow-AuthorizationCodeClient CredentialsOAuth-ProtocolFlow-ClientCredentialsDevice AuthorizationOAuth-ProtocolFlow-DeviceAuthorizationToken ExchangeOAuth-ProtocolFlow-TokenExchangeToken / ImplicitOAuth-ProtocolFlow-ImplicitRefresh TokenOAuth-ProtocolFlow-RefreshTokenResource OwnerOAuth-ProtocolFlow-ResourceOwner授权码 PKCE最常用的 UI 交互流授权码Authorization Code类型面向 UI 交互场景用户输入凭证换取一个授权码再用该授权码兑换访问令牌。其核心调用链为端点参数响应/oauth2.0/authorizeresponse_typecodeclient_idIDredirect_uriCALLBACK授权码作为CALLBACK回调 URL 的查询参数返回/oauth2.0/accessTokengrant_typeauthorization_codeclient_idIDclient_secretSECRETcodeCODEredirect_uriCALLBACK访问令牌PKCERFC 7636读作 pixie为公开客户端无法安全保管client_secret的浏览器/移动端应用提供了一种缓解授权码被拦截威胁的手段客户端在发起授权前先生成一个秘密兑换令牌时再使用该秘密。这样即使授权码被截获由于令牌请求依赖最初生成的秘密截获者也无法利用。授权端点/oauth2.0/authorize接受以下 PKCE 激活参数参数说明code_challenge使用下述方法生成的代码挑战code_challenge_methodplain或S256可选默认按plain处理令牌端点/oauth2.0/accessToken接受以下 PKCE 激活参数参数说明code_verifier客户端在发起授权请求前生成的原始校验器校验逻辑分两种方法若方法为plainCAS 只需比对提供的code_verifier是否与存储的code_challenge字符串一致若方法为S256CAS 需将code_verifier用同样的方式转换——即对 verifier 计算 SHA256 哈希并做 Base64URL 编码——再与存储的code_challenge比对。校验通过后CAS 照常签发访问令牌。其余流程速览Client Credentials适用于服务端到服务端的机器对机器调用客户端直接用自己的client_id/client_secret换取令牌无需用户参与Device Authorization设备授权面向智能电视、打印机等无浏览器或输入受限的设备用户通过另一台设备上的浏览器完成认证与设备用户码审批审批动作由/oauth2.0/device端点承载Token Exchange允许在受信任的客户端/服务之间基于既有令牌换取新令牌Implicit隐式在回调 URL 中直接返回令牌片段适用于纯前端 SPA 等场景OAuth 2.1 已不建议新应用使用Refresh Token当访问令牌过期时用刷新令牌换取新的访问令牌避免用户重新登录Resource Owner密码模式客户端直接收集用户名/密码提交给令牌端点CAS 对其施加了cas.authn.oauth.grants.resource-owner.require-service-header等安全约束。认证节流Throttling对于/oauth2.0/accessToken端点可以启用认证节流保护只要 overlay 中引入了认证节流支持模块CAS 用于常规认证与票据校验端点的节流机制就会自动覆盖到受支持的 OAuth 端点。这能有效抑制针对令牌端点的暴力破解与凭证填充攻击。监控Actuator EndpointsCAS 为 OAuth 模块提供了oauthTokens这个 Actuator 管理端点用于在运行期观测 OAuth 令牌访问令牌、刷新令牌等的存储状态方便运维排查令牌积压、过期清理等问题。启用 Actuator 端点后可通过/actuator/oauthTokens一类路径访问具体路径取决于 Actuator 基础路径配置。令牌在注册中心的存储名oauthCodesCache、oauthAccessTokensCache、oauthRefreshTokensCache也正是该端点监控的核心对象。排障开启 OAuth 协议日志出现令牌签发或校验异常时在 log4j 配置文件中追加以下 Logger 级别即可获得 OAuth 协议层的详细日志... Logger nameorg.apereo.cas.oauth leveldebug additivityfalse AppenderRef refcasConsole/ AppenderRef refcasFile/ /Logger Logger namePROTOCOL_MESSAGE leveldebug additivityfalse AppenderRef refcasConsole/ AppenderRef refcasFile/ /Logger ...其中org.apereo.cas.oauth覆盖 CAS 自身 OAuth 实现类的调试输出PROTOCOL_MESSAGE则负责输出协议消息级请求/响应报文的跟踪信息两者配合可完整还原一次 OAuth 交互的报文细节。客户端示例与延伸阅读官方维护的 OAuth2 Sample Webapp 是一个完整的 OAuth 2.0 示例客户端应用可配合本地 CAS 实例快速验证授权码、令牌刷新等流程。若需进一步深入仓库中与本文直接相关的专题文档还包括令牌 introspection 细节OAuth-Authentication-TokenIntrospectionJWT 访问令牌OAuth-Authentication-JWT-AccessTokens令牌过期策略汇总OAuth-Authentication-TokenExpirationPolicy用户画像与属性返回OAuth-Authentication-UserProfilesOAuth 客户端注册与授权策略OAuth-Authentication-Clients结合本文的端点表、配置属性族与源码控制器位置你已具备在 CAS 上落地 OAuth 2.0 服务端的完整认知闭环模块启用 → 属性调优 → 端点暴露 → 流程选择 → 令牌管理 → 监控排障。赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Apereo CAS OAuth 2.0 授权码流程Authorization Code与 PKCE 扩展实战指南Apereo CAS OAuth 2.0 授权码流程Authorization Code与 PKCE 扩展实战指南 导读 授权码Authorization后端认证鉴权单点登录Apereo CAS OAuth 2.0 Token Exchange 协议流程实战指南Impersonation 与 Delegation 的令牌交换Apereo CAS OAuth 2.0 Token Exchange 协议流程实战指南Impersonation 与 Delegation 的令牌交换 导读后端认证鉴权单点登录Apereo CAS OAuth 隐式授权流Implicit Flow / Token Response Type实战指南Apereo CAS OAuth 隐式授权流Implicit Flow / Token Response Type实战指南 本指南以 Apereo CAS后端认证鉴权单点登录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考