和风飘絮 發表於 2026-1-6 14:53:00

wso2~第三方IDP向wso2用户体系的同步

<p>正常情况下,对接第三方IDP之后,在第三方IDP登录后重定向到wso2平台,然后用户就完成了初始化,并且为用户完成了默认应用的建立;如果希望在自己的用户后,手动为用户处理到wso2平台的用户同步,而不需要用户登录后再同步信息,就需要用到几个项目的用户处理流程了</p>
<h1 id="添加keycloak用户到wso2">添加keycloak用户到wso2</h1>
<h2 id="源码修改-支持kc用户id作为用户名">源码修改-支持kc用户id作为用户名</h2>
<ul>
<li>目前不支持用户名带减号和以0开头的,目前kc-user-id是这种规则,需要把<code>wso2-extensions/identity-governance</code>源码稍微改一下</li>
<li>注册注入:https://github.com/wso2-extensions/identity-governance/blob/master/components/org.wso2.carbon.identity.recovery</li>
<li>用户名不合法及用户已存在的错误抛出,代码出版:org.wso2.carbon.identity.recovery.signup.UserSelfRegistrationManager.handleClientException()方法</li>
<li>/v1.0/me方法的程序入口:org.wso2.carbon.identity.user.endpoint.impl.MeApiServiceImpl.mePost()</li>
<li>用户名正则校验位置:org.wso2.carbon.user.core.common.AbstractUserStoreManager.addUser()
<ul>
<li>org.wso2.carbon.user.core.common.AbstractUserStoreManager.checkUserNameValid()</li>
</ul>
</li>
</ul>
<pre><code>// org.wso2.carbon:org.wso2.carbon.user.core-4.9.0.jar
// addUser()
if (!checkUserNameValid(userStore.getDomainFreeName()) &amp;&amp;
      !UserCoreUtil.getSkipUsernamePatternValidationThreadLocal()) {
      
      }
      
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/118538/202601/118538-20260106144729258-158977570.png" alt="图片" loading="lazy"></p>
<p>注释掉这个验证规则</p>
<p><img src="https://img2024.cnblogs.com/blog/118538/202601/118538-20260106144743375-1153917045.png" alt="图片" loading="lazy"></p>
<h2 id="添加用户方法调用">添加用户方法调用</h2>
<pre><code>curl \
    -X POST 'https://test-apim.pkulaw.com/api/identity/user/v1.0/me' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Basic YWRtaW46YWRtaW4=' \
    -d '{
      "user": {
            "username": "0007aaa6-cc4c-4428-a026-a4ddfec2c965",
            "realm": "PRIMARY",
            "password": "Password12!",
            "claims": [
                {
                  "uri": "http://wso2.org/claims/givenname",
                  "value": "kim"
                },
                {
                  "uri": "http://wso2.org/claims/emailaddress",
                  "value": "kim.anderson@gmail.com"
                }
                   {
                  "uri": "http://wso2.org/claims/roles",
                  "value": "Internal/subscriber "
                }
            ]
      }
    }'
</code></pre>
<p>返回下面状态,或者直接返回HTTP 201(无返回值)</p>
<pre><code>{
"code": "USR-02003",
"message": "Successful user self registration. Account verification not required.",
"notificationChannel": null
}
</code></pre>
<ul>
<li>操作成功的状态码是<code>201</code>,并且用户会自动添加下面3个角色
<ul>
<li>Internal/subscriber</li>
<li>Internal/everyone</li>
<li>Internal/selfsignup</li>
</ul>
</li>
<li>用户名不合法 ,返回400状态码,code为"20045"</li>
<li>用户名已经存在,返回409状态,code为"20030"</li>
</ul>
<h1 id="添加应用">添加应用</h1>
<p>通过<code>api/am/devportal/applications</code>接口获取用户应用时,如果用户还没有建立应用,系统会为它<code>添加一个默认的应用</code>,这是wso2内部实现的</p>
<h1 id="获取应用">获取应用</h1>
<p>模拟当前用户登录,并获取token</p>
<pre><code>curl \
    -X POST 'https://test-apim.pkulaw.com/oauth2/token' \
    -H 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=password' \
    --data-urlencode 'username=kim2' \
    --data-urlencode 'password=Password12!' \
    --data-urlencode 'scope=apim:subscribe' \
    --data-urlencode 'client_id=uFZG4jF7VloJc4LEwiYIcofNb3ka' \
    --data-urlencode 'client_secret=GFGPfRa961aD4M_xCL3n6I54t7Ea' \
    -k
</code></pre>
<p>返回</p>
<pre><code>{
"access_token": "9953e98a-08db-39fa-9390-63ef5cab256c",
"scope": "apim:subscribe",
"token_type": "Bearer",
"expires_in": 3600
}
</code></pre>
<p>获取自己的应用,如果没有应用,系统会添加一个<code>默认应用</code></p>
<pre><code>GET        https://test-apim.pkulaw.com/api/am/devportal/applications
</code></pre>
<p>返回</p>
<pre><code>{
    "count": 1,
    "list": [
      {
            "applicationId": "781f3363-8fdc-4c32-8ebf-0f0e8d6846d6",
            "name": "tes",
            "throttlingPolicy": "Unlimited",
            "description": "test",
            "status": "APPROVED",
            "groups": [

            ],
            "subscriptionCount": 0,
            "attributes": {

            },
            "owner": "0007aaa6-cc4c-4428-a026-a4ddfec2c965",
            "tokenType": "DEFAULT",
            "createdTime": "1767676614000",
            "updatedTime": "1767676614000"
      }
    ],
    "pagination": {
      "offset": 0,
      "limit": 25,
      "total": 2,
      "next": "",
      "previous": ""
    }
}
</code></pre>
<p>wso2是一个非常庞大的框架,单从对用户同步这块小需求,就涉及到了底层代码的修改,这个小需求,我拉取分析的项目有几个,但最终调整代码的只有carbon-kernel项目</p>
<ul>
<li>carbon-apimgt</li>
<li>carbon-identity-framework</li>
<li>identity-api-server</li>
<li>identity-governance</li>
<li>carbon-kernel</li>
</ul>


</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/19447712
頁: [1]
查看完整版本: wso2~第三方IDP向wso2用户体系的同步