大家都叫我云姐 發表於 2025-5-18 19:42:00

wso2~对接外部认证系统keycloak

<ul>
<li>https://shammijayasinghe.medium.com/saml-sso-wso2-api-manager-and-keycloak-bd3eec6038b2</li>
<li>https://chakray.com/how-use-keycloak-as-wso2-api-manager-identity-provider</li>
<li>https://htamahc.medium.com/configuring-keycloak-as-an-identity-provider-in-wso2-identity-server-c5cc124b6d6c</li>
<li>https://dzone.com/articles/sso-wso2-api-manager-amp-keycloak</li>
<li>https://is.docs.wso2.com/en/5.11.0/learn/configuring-claims-for-an-identity-provider</li>
<li>https://is.docs.wso2.com/en/5.11.0/learn/configuring-roles-for-an-identity-provider</li>
<li>https://is.docs.wso2.com/en/5.11.0/learn/configuring-just-in-time-provisioning-for-an-identity-provider/</li>
</ul>
<p>在 WSO2 Identity Server 或 WSO2 API Manager 中,<strong>Identity Providers (身份提供者)</strong> 功能允许您将外部身份管理系统(如 Keycloak、Azure AD、Okta 等)集成到 WSO2 平台中,实现联合身份认证(Federation)。以下是使用 WSO2 Identity Providers 功能并与 Keycloak 对接的完整步骤:</p>
<h1 id="1-identity-providers-功能概述">1. Identity Providers 功能概述**</h1>
<ul>
<li><strong>作用</strong>:
<ul>
<li>允许用户通过外部身份提供者(如 Keycloak)登录 WSO2 管理的应用或 API。</li>
<li>支持协议:SAML 2.0、OAuth 2.0/OpenID Connect (OIDC)、WS-Federation 等。</li>
</ul>
</li>
<li><strong>典型场景</strong>:
<ul>
<li>企业已有 Keycloak 用户体系,需与 WSO2 平台集成。</li>
<li>需要将 WSO2 作为身份代理(Proxy),集中管理多个外部身份源。</li>
</ul>
</li>
</ul>
<hr>
<h1 id="2-配置-keycloak-作为外部-identity-provider">2. 配置 Keycloak 作为外部 Identity Provider**</h1>
<h4 id="步骤-1在-keycloak-中创建客户端client"><strong>步骤 1:在 Keycloak 中创建客户端(Client)</strong></h4>
<ol>
<li>
<p><strong>登录 Keycloak 管理控制台</strong><br>
访问 <code>https://keycloak-host:port/auth/admin</code>。</p>
</li>
<li>
<p><strong>创建 Realm(如果尚未创建)</strong><br>
进入默认的 <code>master</code> Realm 或新建一个(如 <code>my-realm</code>)。</p>
</li>
<li>
<p><strong>创建客户端(Client)</strong></p>
<ul>
<li>导航到 <strong>Clients</strong> → <strong>Create</strong>。</li>
<li>设置:
<ul>
<li><strong>Client ID</strong>:<code>wso2-client</code>(自定义名称)。</li>
<li><strong>Client Protocol</strong>:<code>openid-connect</code>。</li>
</ul>
</li>
<li>保存后,进入客户端配置:
<ul>
<li><strong>Valid Redirect URIs</strong>:添加 WSO2 的回调地址,如 <code>https://wso2-host:9443/commonauth</code>。</li>
<li><strong>Web Origins</strong>:<code>*</code>(或限制为 WSO2 域名)。</li>
<li>启用 <strong>Client authentication</strong>(生成客户端密钥)。</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>记录关键信息</strong></p>
<ul>
<li><strong>Client ID</strong>:<code>wso2-client</code></li>
<li><strong>Client Secret</strong>:在 <strong>Credentials</strong> 标签页中获取。</li>
<li><strong>Keycloak Realm 的 OpenID Endpoint</strong>:<br>
<code>https://keycloak-host:port/auth/realms/my-realm/.well-known/openid-configuration</code></li>
</ul>
</li>
</ol>
<hr>
<h4 id="步骤-2在-wso2-中配置-keycloak-为外部-identity-provider"><strong>步骤 2:在 WSO2 中配置 Keycloak 为外部 Identity Provider</strong></h4>
<ol>
<li>
<p><strong>登录 WSO2 管理控制台</strong><br>
访问 <code>https://wso2-host:9443/carbon</code>,使用管理员账号登录。</p>
</li>
<li>
<p><strong>创建新的 Identity Provider</strong></p>
<ul>
<li>导航到 <strong>Main</strong> → <strong>Identity</strong> → <strong>Identity Providers</strong> → <strong>Add</strong>。</li>
<li>输入名称(如 <code>Keycloak-IDP</code>)。</li>
</ul>
</li>
<li>
<p><strong>配置 OpenID Connect 连接</strong></p>
<ul>
<li>在 <strong>Federated Authenticators</strong> → <strong>OpenID Connect Configuration</strong> 中:
<ul>
<li><strong>Enable</strong>:勾选。</li>
<li><strong>Client ID</strong>:<code>wso2-client</code>(Keycloak 中创建的客户端 ID)。</li>
<li><strong>Client Secret</strong>:Keycloak 客户端的密钥。</li>
<li><strong>Authorization Endpoint</strong>:Keycloak 的 OIDC 授权端点(如 <code>https://keycloak-host:port/auth/realms/my-realm/protocol/openid-connect/auth</code>)。</li>
<li><strong>Token Endpoint</strong>:Keycloak 的令牌端点(如 <code>https://keycloak-host:port/auth/realms/my-realm/protocol/openid-connect/token</code>)。</li>
<li><strong>UserInfo Endpoint</strong>:用户信息端点(如 <code>https://keycloak-host:port/auth/realms/my-realm/protocol/openid-connect/userinfo</code>)。</li>
<li><strong>JWKS Endpoint</strong>:JWKS 端点(如 <code>https://keycloak-host:port/auth/realms/my-realm/protocol/openid-connect/certs</code>)。</li>
<li><strong>Callback URL</strong>:<code>https://wso2-host:9443/commonauth</code>(与 Keycloak 客户端配置一致)。</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>配置声明映射(Claim Mapping)</strong></p>
<ul>
<li>在 <strong>Claim Configuration</strong> 中,将 Keycloak 返回的用户属性(如 <code>email</code>、<code>given_name</code>)映射到 WSO2 的本地声明。</li>
<li>示例:
<ul>
<li><strong>Remote Claim</strong>:<code>email</code> → <strong>Local Claim</strong>:<code>http://wso2.org/claims/emailaddress</code></li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>保存配置</strong><br>
点击 <strong>Register</strong> 完成 Identity Provider 的创建。</p>
</li>
</ol>
<p><img src="https://images.cnblogs.com/cnblogs_com/lori/2430318/o_250609051135_keycloak_idp.png" alt="" loading="lazy"></p>
<h1 id="3-配置服务提供者service-provider使用-keycloak-认证">3. 配置服务提供者(Service Provider)使用 Keycloak 认证**</h1>
<h4 id="场景-1wso2-作为服务提供者sp"><strong>场景 1:WSO2 作为服务提供者(SP)</strong></h4>
<ol>
<li>
<p><strong>创建服务提供者(Service Provider)</strong></p>
<ul>
<li>导航到 <strong>Main</strong> → <strong>Identity</strong> → <strong>Service Providers</strong> → <strong>Add</strong>。</li>
<li>输入名称(如 <code>My-App</code>)。</li>
</ul>
</li>
<li>
<p><strong>配置联合认证</strong></p>
<ul>
<li>在 <strong>Local &amp; Outbound Authentication Configuration</strong> 中:
<ul>
<li>选择 <strong>Federated Authentication</strong>。</li>
<li>勾选刚创建的 <code>Keycloak-IDP</code>。</li>
</ul>
</li>
<li>可选:设置认证步骤(多因素认证)。</li>
</ul>
</li>
<li>
<p><strong>配置声明映射</strong><br>
确保服务提供者使用的声明与 Identity Provider 的映射一致。</p>
</li>
</ol>
<hr>
<h4 id="场景-2通过-wso2-访问-apiapi-manager-集成"><strong>场景 2:通过 WSO2 访问 API(API Manager 集成)</strong></h4>
<ol>
<li>
<p><strong>在 API Manager 中启用 Keycloak 认证</strong></p>
<ul>
<li>登录 API Publisher(<code>https://wso2-host:9443/publisher</code>)。</li>
<li>创建或编辑 API → <strong>Runtime Configurations</strong> → <strong>Security</strong>。</li>
<li>勾选 <strong>OAuth2</strong> 或 <strong>OpenID Connect</strong>,并关联 <code>Keycloak-IDP</code>。</li>
</ul>
</li>
<li>
<p><strong>订阅 API 并测试</strong></p>
<ul>
<li>用户通过 Keycloak 登录开发者门户,获取令牌后调用 API。</li>
</ul>
</li>
</ol>
<hr>
<h1 id="4-自定义claim的映射">4. 自定义claim的映射**</h1>
<p>将第三方idp的用户字段映射到wso2-apim中,可以按着下面步骤实现</p>
<h4 id="配置deploymenttoml开启自定义claim"><strong>配置deployment.toml,开启自定义claim</strong></h4>
<blockquote>
<p>如果不开启,它会映射默认的几个字段,如<code>uid</code>,<code>nickName</code>,<code>displayName</code>,<code>mail</code>,<code>roles</code>等</p>
</blockquote>
<pre><code>
enable_custom_claim_mappings = true
</code></pre>
<h4 id="kc中定义固定的wso2角色到token中">kc中定义固定的wso2角色到token中</h4>
<p><strong>固定的客户端角色</strong><br>
<img src="https://images.cnblogs.com/cnblogs_com/lori/2399824/o_250702084634_hard_role_kc.png" alt="" loading="lazy"></p>
<p><strong>自定义的token中的元素</strong><br>
<img src="https://images.cnblogs.com/cnblogs_com/lori/2399824/o_250703004515_kc_hard_role.png" alt="" loading="lazy"></p>
<p><strong>wso2中注册用户后具有这个角色</strong><br>
<img src="https://images.cnblogs.com/cnblogs_com/lori/2399824/o_250703005138_subscribe_role.png" alt="" loading="lazy"></p>
<p><strong>用户每次登录时都会进行用户信息的同步</strong><br>
<img src="https://images.cnblogs.com/cnblogs_com/lori/2399824/o_250703010200_claim_async.png" alt="" loading="lazy"></p>
<p>** IDP到wso2时的对应关系的优先级</p>
<blockquote>
<p>找到对应的sp,通过在sp的<code>Claim Configuration</code>,需要注意其它对应的sp也需要有相同的<code>Claim Configuration</code>,否则用户登录这块会出现无法映射的问题。</p>
</blockquote>
<ol>
<li>sp中定义的claim优先于idp</li>
<li>建议在idp中直接统一定于,避免每个sp中定义的不同,导致系统无法登录的问题</li>
</ol>
<p><img src="https://images.cnblogs.com/cnblogs_com/lori/2399824/o_250703012556_mapping_email.png" alt="" loading="lazy"></p>
<h1 id="5-数据的映射">5. 数据的映射</h1>
<p><strong>数据何时从第三方IDP同步到wso2</strong><br>
用户通过第三方登录时,当数据有变更,数据会自动同步到wso2系统,它在wso2am_shared_db库中um_user_attribute表存储,如图</p>
<p><img src="https://images.cnblogs.com/cnblogs_com/lori/2430318/o_250609054026_user_mapping.png" alt="" loading="lazy"></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/18882531
頁: [1]
查看完整版本: wso2~对接外部认证系统keycloak