尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Apereo CAS OpenID Connect Native SSO:面向移动与桌面应用的设备级单点登录实战指南

Apereo CAS OpenID Connect Native SSO:面向移动与桌面应用的设备级单点登录实战指南 后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载导读本文围绕 Apereo CAS 的 OpenID Connect 扩展 ——Native SSO原生单点登录讲解如何让同一厂商旗下的多款移动端或桌面端应用借助设备会话device session实现免跳转、免重复登录的跨应用单点登录体验。读完本文你将掌握device_ssoscope 的配置方式、device_secret的获取流程、基于urn:ietf:params:oauth:grant-type:token-exchange授权类型的直接后台令牌交换back-channel token exchange请求以及与之配套的客户端注册策略与测试验证方法。文中的所有配置示例均可在当前仓库中找到对应源码与端到端测试佐证。什么是 Native SSO为应用套件而生的 OIDC 扩展Native SSO 是 OpenID Connect 的一种扩展机制其目标是为移动端或桌面端应用套件app suite简化用户体验多个应用共享同一个设备上的会话凭据用户只需在其中任意一个应用中完成一次登录其余应用即可静默获得令牌。该扩展依赖的是同一厂商旗下多个应用之间共享 ID token 与设备绑定密钥device-bound secret应用 #1 通过标准的code授权流程完成终端用户认证并在授权请求中携带特殊的device_ssoscope以表明自己希望获得device_secret用于 Native SSO应用 #2 在发现自己的凭据存储credential store中已有 ID token 和device_secret后可以假定用户已登录并直接向 CAS 发起后台令牌交换请求获取新的令牌从而省去跳转到 OpenID ProviderOP再次登录的环节。值得注意的是这种机制要求参与 SSO 的应用之间具备足够的信任级别而这种信任只有在它们属于同一厂商时才具有实际可行性。因此仅提供单一应用的厂商通常不需要关注此扩展。从仓库源码看CAS 在support/cas-server-support-oidc-core/src/main/java/org/apereo/cas/oidc/OidcConstants.java中明确声明了相关常量DEVICE_SECRET device_secret用于 Native SSO 的设备密钥注释指出它包含与设备以及当前在该设备上认证的用户相关的数据DS_HASH ds_hashID token 中携带的哈希值用于建立id_token与所签发device_secret之间的绑定关系CLAIM_SESSION_REF sid_ref会话引用标识可将 ID token 反向关联回会话注册表registry。整体流程两步完成的跨应用静默登录整个 Native SSO 流程可以概括为两大阶段引导阶段应用 #1在线认证客户端应用 #1 使用常规code流程认证终端用户授权请求中附带device_ssoscope向 CAS 表明其意图在授权码交换令牌时CAS 额外返回一个device_secret。静默阶段应用 #2后台令牌交换客户端应用 #2 读取共享凭据存储中的 ID token 与device_secret直接调用 CAS 的令牌端点token endpoint发起 token exchange 请求换取面向自身的 access token / id_token全程无需用户再次跳转登录页。这一流程在仓库的端到端测试ci/tests/puppeteer/scenarios/oidc-token-exchange/script.js中得到了完整验证verifyTokenExchangeNativeSso()首先用client_idclient、scopeopenid email device_sso发起/cas/oidc/authorize请求完成登录并取得授权码随后用授权码换取令牌并断言响应中access_token、id_token、device_secret三者都存在解码 ID token 后校验其携带sid、ds_hash、sid_ref等声明最后以client2:secret2的身份用subject_tokenid_token、actor_tokendevice_secret发起 token exchange成功换取新的 access token 与 id_token。应用配置启用 device_sso scope参与 Native SSO 的客户端应用relying parties必须配置为支持device_ssoscope。该 scope 用于声明此应用打算使用 Native SSO 特性。CAS 在OidcConstants.java的 scope 枚举中对它的语义做了明确注释当授权请求中出现此 scope且授权码被交换为令牌时将返回一个新的device_secret这对 Native SSO 与原生应用授权流程至关重要。一个启用device_sso的 OIDC 注册服务配置示例{ class : org.apereo.cas.services.OidcRegisteredService, clientId: ..., clientSecret: ..., serviceId : ..., name: OIDC, id: 1, scopes : [ java.util.HashSet, [ openid, profile, device_sso ] ] }字段说明class固定为org.apereo.cas.services.OidcRegisteredService标识这是一条 OIDC 类型的注册服务clientId/clientSecret为客户端凭据用于后续的 Basic 认证serviceId为服务匹配规则通常为正则表达式决定哪些回调地址归属该客户端scopes中的device_sso是触发device_secret签发的关键开关。当令牌交换完成后上述 scope 允许认证流程最终生成device_secret令牌端点返回的响应体如下{ access_token : ..., token_type : Bearer, expires_in : 600, scope : openid profile, id_token : eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUl..., device_secret : ... }要点解析expires_in表示 access token 的有效期示例中为 600 秒id_token中会携带sid会话 ID、ds_hash设备密钥绑定哈希、sid_ref会话引用等声明测试脚本script.js对其逐一断言device_secret即为本次设备会话绑定的密钥应安全存放在与该厂商其他应用共享的凭据存储中。此外CAS 在 OpenID 发现配置模型api/cas-server-core-api-configuration-model/src/main/java/org/apereo/cas/configuration/model/support/oidc/OidcDiscoveryProperties.java中也将device_sso列入受支持的 scope 列表说明该 scope 会出现在服务提供方的发现文档discovery document中客户端可据此进行能力探测。令牌交换请求应用 #2 的静默登录当应用 #2 在共享凭据存储中发现 ID token 与device_secret时即可假定用户已登录并向 CAS 发起直接的后台令牌交换请求即 token exchange 请求。前置条件发起令牌交换请求需要满足两个注册配置前提客户端应用必须配置为支持urn:ietf:params:oauth:grant-type:token-exchange授权类型grant type客户端的令牌交换策略token exchange policy必须允许urn:openid:params:token-type:device-secret令牌类型。注册服务完整配置{ class : org.apereo.cas.services.OidcRegisteredService, clientId: ..., clientSecret: ..., serviceId : ..., name: OIDC, id: 1, scopes : [ java.util.HashSet, [ openid, email, profile, device_sso ] ], supportedGrantTypes: [ java.util.HashSet, [ authorization_code, urn:ietf:params:oauth:grant-type:token-exchange ] ], tokenExchangePolicy: { class: org.apereo.cas.support.oauth.services.DefaultRegisteredServiceOAuthTokenExchangePolicy, allowedTokenTypes: [ java.util.HashSet, [ urn:openid:params:token-type:device-secret, urn:ietf:params:oauth:token-type:access_token, urn:ietf:params:oauth:token-type:id_token ] ] } }配置说明supportedGrantTypes中同时包含authorization_code用于常规登录引导与urn:ietf:params:oauth:grant-type:token-exchange用于静默换发令牌tokenExchangePolicy.allowedTokenTypes决定了本次交换允许涉及的令牌类型其中urn:openid:params:token-type:device-secret是 Native SSO 场景的关键项。请求参数发起令牌交换请求时需要按如下规则填充参数请求参数取值grant_typeurn:ietf:params:oauth:grant-type:token-exchangesubject_token应用 #1 流程中获得的 ID tokensubject_token_typeurn:ietf:params:oauth:token-type:id_tokenactor_token应用 #1 流程中获得的device_secretactor_token_typeurn:openid:params:token-type:device-secretrequested_token_typeurn:ietf:params:oauth:token-type:access_token或urn:ietf:params:oauth:token-type:id_tokenscope本次希望获得的权限范围如openid profileresource可选目标资源标识用于限定令牌的受众audience其中subject_token主题令牌代表被交换的主体身份——即 ID token 所声明的终端用户actor_token参与者令牌代表发起交换的设备身份——即此前签发的device_secretrequested_token_type指明期望换取的令牌类型。源码级实现印证CAS 在support/cas-server-support-oauth-api/src/main/java/org/apereo/cas/support/oauth/OAuth20TokenExchangeTypes.java中定义了上述令牌类型枚举ACCESS_TOKEN(urn:ietf:params:oauth:token-type:access_token)DEVICE_SECRET(urn:openid:params:token-type:device-secret)——注释明确指出在 Native SSO 流程中允许基于参与者令牌actor token将设备密钥交换为访问令牌ID_TOKEN(urn:ietf:params:oauth:token-type:id_token)而令牌交换策略的落地实现在support/cas-server-support-oauth-services/src/main/java/org/apereo/cas/support/oauth/services/DefaultRegisteredServiceOAuthTokenExchangePolicy.javaisTokenExchangeAllowed(...)方法通过allowedResources、allowedAudience、allowedTokenTypes三项正则匹配来裁决是否允许交换canSubjectTokenActAs(...)方法通过allowedActorTokenTypes与requiredActorTokenAttributes来约束作为参与者的令牌/主体是否被允许以该身份行动即校验 actor token 的类型与必要属性。两个方法均为allowedXxx null时放行的宽松语义字段未配置则不做限制配合接口RegisteredServiceOAuthTokenExchangePolicy位于同目录RegisteredServiceOAuthTokenExchangePolicy.java共同构成完整的可扩展策略体系。端到端验证仓库测试场景剖析仓库中的 puppeteer 端到端测试ci/tests/puppeteer/scenarios/oidc-token-exchange/为我们演示了完整的 Native SSO 场景包含两条注册服务配置Sample-1.jsonclient应用scopes 含openid email profile device_ssotoken exchange policy 中allowedTokenTypes覆盖 device-secret / access_token / id_token / jwt并限定allowedResources为^https://localhost:9859/anything/backend.*Sample-2.jsonclient2应用scopes 为openid profile同样启用 token-exchange 授权类型并允许 device-secret 令牌类型。测试脚本script.js的核心断言逻辑包括引导阶段以openid email device_ssoscope 走 authorize 流程换码后断言响应同时包含access_token、id_token、device_secret解码 ID token断言其携带sid、ds_hash、sid_ref且aud为client静默阶段换 access token以client2身份 POST 令牌端点携带subject_tokenid_token、subject_token_typeurn:ietf:params:oauth:token-type:id_token、actor_tokendevice_secret、actor_token_typeurn:openid:params:token-type:device-secret断言响应返回 access token、issued_token_type为urn:ietf:params:oauth:token-type:access_token静默阶段换 id_token同样的 actor/subject 参数将requested_token_type设为 id_token 类型断言响应包含新的 id_token且其aud变为client2、sid仍然存在。同时同一场景还覆盖了常规的 access token 互换access_token → access_token / jwt / id_token用于验证 token exchange 功能在非 Native SSO 场景下的通用行为。常见问题与注意事项单应用厂商不需要此扩展Native SSO 依赖多个应用间共享 ID token 与设备密钥只有同一厂商的应用套件才具备所需的信任基础device_secret的安全性它是绑定设备的秘密应仅存储于受保护的设备凭据存储中避免经不安全的通道传输ds_hash用于将 ID token 与device_secret绑定防止跨设备滥用策略字段的宽松语义DefaultRegisteredServiceOAuthTokenExchangePolicy中allowedTokenTypes、allowedResources、allowedAudience、allowedActorTokenTypes等字段若未配置默认放行 null时不限制生产环境建议显式收紧scope 必须显式声明device_sso需要出现在注册服务的scopes中否则 CAS 不会在令牌响应中签发device_secret授权类型必须显式声明urn:ietf:params:oauth:grant-type:token-exchange需要加入supportedGrantTypes否则令牌端点将拒绝 token exchange 请求。延伸阅读OAuth 协议令牌交换流程详解token exchange 授权类型的通用协议说明OpenID Connect 认证配置OIDC 注册服务的基础配置方式令牌交换策略实现DefaultRegisteredServiceOAuthTokenExchangePolicy.java端到端测试脚本oidc-token-exchange/script.js 与配套的服务配置 Sample-1.json、Sample-2.json。赞分享后端认证鉴权单点登录【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Authelia 与 Glitchtip 集成OpenID Connect 1.0 单点登录SSO配置实战指南Authelia 与 Glitchtip 集成OpenID Connect 1.0 单点登录SSO配置实战指南 本指南详细讲解如何将自托管错误跟踪平台 G后端认证鉴权单点登录身份认证应用安全book-to-skill 快速上手指南一键把技术书变成按需加载的 Agent 技能最多省 51 倍 tokenbook to skill 快速上手指南一键把技术书变成按需加载的 Agent 技能最多省 51 倍 token 上周你让 Agent 帮你审一段重试逻辑AI 技能Apereo CAS 中 OpenID Connect 的 WebFinger Issuer Discovery 实战指南Apereo CAS 中 OpenID Connect 的 WebFinger Issuer Discovery 实战指南 本篇技术指南围绕 Apereo CA后端认证鉴权单点登录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表