关于对wso2和keycloak的token交换的调研
<h1 id="流程梳理手稿">流程梳理手稿</h1><ul>
<li>用户以keycloak为中心,在wso2中添加了keycloak做为IDP,wso2开发者平台通过keycloak进行登录</li>
<li>登录成功后,通过keycloak颁发的auth_code,置换keycloak平台的access_token</li>
<li>通过wso2平台的urn:ietf:params:oauth:grant-type:jwt-bearer方式,从keycloak平台交换一个wso2平台的用户token</li>
<li>在wso2平台,通过用户token进行应用的添加,在应用中,生成应用的consumer_key和consumer_secret密钥对,简称<code>app密钥对</code></li>
<li>通过<code>app密钥对</code>进行<code>client_credentials</code>认证,生成app级别的token,它可以是jwt或者是普通的token(会存储到数据库)</li>
<li>用户在通过客户端工具(cherry studio,cursor)连接wso2平台的api和mcp服务时,使用这个app的token进行授权</li>
<li>如果用户访问的api资源需要认证,那么,在打开链接后,会先跳到keycloak平台进行认证</li>
<li>我们通过keycloak平台支持的<code>token exchange</code>功能,可以将wos2平台的token置换成keycloak平台的token,即统一认证平台的token</li>
<li>我们在访问api资源之前,可以加一个网关,用来实现wso2 token到keycloak token的交换</li>
</ul>
<h1 id="wso2与keycloak集成认证流程时序图">WSO2与Keycloak集成认证流程时序图</h1>
<p>[下面内容为AI生成]</p>
<div class="mermaid">sequenceDiagram
participant User as 用户/客户端
participant Keycloak as Keycloak IDP
participant DevPortal as WSO2开发者平台
participant WSO2Gateway as WSO2网关
participant APIService as API/MCP服务
%% 第一阶段:用户登录和初始认证
Note over User,DevPortal: 1. 用户登录流程
User->>Keycloak: 用户登录(用户名/密码)
Keycloak-->>User: 返回auth_code
User->>DevPortal: 携带auth_code访问开发者平台
DevPortal->>Keycloak: 2. 用auth_code换取access_token
Keycloak-->>DevPortal: 返回Keycloak access_token
DevPortal->>DevPortal: 3. 通过jwt-bearer换取WSO2用户token
DevPortal-->>User: 登录成功,建立WSO2用户会话
%% 第二阶段:应用创建和令牌生成
Note over User,DevPortal: 4. 应用管理
User->>DevPortal: 创建应用
DevPortal->>DevPortal: 生成应用密钥对(consumer_key/secret)
DevPortal-->>User: 返回应用密钥对
Note over User,DevPortal: 5. 应用令牌生成
User->>DevPortal: 使用client_credentials请求app token
DevPortal->>DevPortal: 验证应用密钥对
DevPortal-->>User: 返回app级别token(JWT/普通token)
%% 第三阶段:API访问和令牌交换
Note over User,APIService: 6. 客户端访问服务
User->>APIService: 使用app token访问API/MCP服务
APIService->>WSO2Gateway: 转发请求(携带WSO2 token)
Note over WSO2Gateway,Keycloak: 7. 认证检查和跳转
APIService-->>User: 需要认证,重定向到Keycloak
User->>Keycloak: 用户认证(如需要)
Keycloak-->>User: 认证完成,重定向回服务
Note over WSO2Gateway,Keycloak: 8. Token交换流程
WSO2Gateway->>Keycloak: 9. 通过token exchange交换token
Keycloak-->>WSO2Gateway: 返回Keycloak平台token
Note over WSO2Gateway,APIService: 10. 最终API访问
WSO2Gateway->>APIService: 10. 携带Keycloak token访问API资源
APIService-->>WSO2Gateway: 返回API响应
WSO2Gateway-->>User: 返回最终结果
</div><h2 id="流程步骤说明">流程步骤说明</h2>
<h3 id="阶段一用户登录和初始认证">阶段一:用户登录和初始认证</h3>
<ol>
<li><strong>用户登录</strong>:用户通过Keycloak进行认证,获取auth_code</li>
<li><strong>Token交换</strong>:WSO2开发者平台使用auth_code从Keycloak换取access_token</li>
<li><strong>统一令牌</strong>:WSO2通过jwt-bearer授权方式,从Keycloak获取WSO2用户token</li>
</ol>
<h3 id="阶段二应用创建和令牌生成">阶段二:应用创建和令牌生成</h3>
<ol start="4">
<li><strong>应用创建</strong>:用户在WSO2开发者平台创建应用,生成consumer_key/consumer_secret</li>
<li><strong>应用令牌</strong>:通过client_credentials授权类型生成app级别token(可以是JWT或普通token)</li>
</ol>
<h3 id="阶段三api访问和令牌交换">阶段三:API访问和令牌交换</h3>
<ol start="6">
<li><strong>客户端访问</strong>:客户端工具使用app token连接WSO2 API/MCP服务</li>
<li><strong>认证检查</strong>:访问需要认证的API时,系统检查并重定向到Keycloak</li>
<li><strong>Token交换</strong>:WSO2网关通过Keycloak的token exchange功能,将WSO2 token交换为Keycloak token</li>
<li><strong>API访问</strong>:使用统一的Keycloak token访问最终的API资源</li>
</ol>
<h2 id="关键技术点">关键技术点</h2>
<ol>
<li><strong>OAuth 2.0流程</strong>:混合使用了authorization_code和client_credentials授权类型</li>
<li><strong>Token Exchange</strong>:WSO2与Keycloak之间的令牌交换机制</li>
<li><strong>统一认证</strong>:以Keycloak为中心的统一身份管理</li>
<li><strong>应用级认证</strong>:通过client_credentials实现应用级别的API访问</li>
<li><strong>用户级认证</strong>:通过用户令牌实现需要用户上下文的操作</li>
</ol>
<p>这个时序图清晰地展示了整个复杂认证流程中各个组件之间的交互关系,特别是WSO2与Keycloak之间的令牌交换机制。</p>
</div>
<div id="MySignature" role="contentinfo">
<p></p>
<div class="navgood">
<p>作者:仓储大叔,张占岭,<br>
荣誉:微软MVP<br>QQ:853066980</p>
<p><strong>支付宝扫一扫,为大叔打赏!</strong>
<br><img src="https://images.cnblogs.com/cnblogs_com/lori/237884/o_IMG_7144.JPG"></p>
</div><br><br>
来源:https://www.cnblogs.com/lori/p/19941749 看完你的这个调研帖子,收获很大!这种WSO2和Keycloak结合的认证架构确实在实际项目中很实用,尤其是需要统一身份管理的企业场景。
几点感受:
[*]你的流程梳理得很清晰,从用户登录到应用创建再到API访问,完整地覆盖了整个认证链路。特别是最后一步通过网关实现token exchange,这个思路很棒!
[*]关于时序图里提到的token exchange,我之前在项目中也有类似需求。Keycloak的token exchange功能确实很强大,支持将外部token转换为Keycloak token。不过在实际落地时,有个小建议:要注意token的有效期和刷新机制,避免出现token过期后用户需要重新登录的情况。
[*]看到你们用client_credentials来做应用级认证,这个很标准。不过如果后续有需要用户上下文的场景,记得要保留用户token的获取方式,因为有些API可能需要获取当前用户的信息。
[*]关于网关那块,如果WSO2本身有API Gateway的功能,其实可以不用额外加网关,直接在WSO2 Gateway层做token exchange就行,能减少部署复杂度。
总结:这是一份很有价值的技术调研,对于需要整合多个平台认证系统的同学来说很有参考意义!期待你们后续的实践分享~
https://images.cnblogs.com/cnblogs_com/lori/237884/o_IMG_7144.JPG 顺便支持下大叔的打赏二维码:haha:
頁:
[1]