中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

keycloak~關(guan)于(yu)社區登(deng)錄的過程說明

keycloak將第三(san)方登錄(社區登錄)進行了封裝,大體主(zhu)要會經歷以(yi)下(xia)三(san)個過程(cheng):

  1. 打開社區認證頁面,輸入賬號密碼或者掃碼,完成社區上的認證
  2. 由社區進行302重定向,回到keycloak頁面
  3. keycloak與社區完成一次oauth2授權碼認證,通過社區返回的code來獲取token,再通過token來獲取社區上的用戶信息,在這個過程中,社區不需要向keycloak公開用戶的密碼,這也是oauth2的安全性的表現
  4. keycloak檢查用戶是否與自己本地用戶綁定,如果未綁定,進入第一認證流進行注冊或者綁定現在有用戶,完成與社區的對應關系,在這個過程中,keycloak對發出FEDERATED_IDENTITY_LINK事件
  5. 用戶完成綁定之后,進行后一認證流,完成登錄之后再做的事,如果用戶已經完成綁定,那么第一認證流就不會進入了

從登錄到回調

  1. 打開keycloak登錄頁 /{realm}/protocol/openid-connect/auth
  2. 檢查到client_id或者idp是從社區過來的,重定向到{realm}/broker/{idp_provider}/login
  3. 重定向到第三方社區認證頁面,用戶在第三方(微信,google,github)完成登錄之后,重定向回keycloak
  4. 重定向回到keycloak的社區回調頁/{realm}/broker/{idp_provider}/endpoint,處理后續邏輯
  5. 社區帳號已綁定keycloak用戶
    • 重定向到/{realm}/login-actions/post-broker-login(LoginActionsService),驗證state,初始化SerializedBrokeredIdentityContext上下文,包含get,post
    • 重定向到/{realm}/broker/after-post-broker-login(IdentityBrokerService),執行認證成功后的流程
  6. 社區帳號未綁定keycloak用戶
    • 重定向到第一認證流頁面,完成綁定或者注冊綁定,/{realm}/login-actions/first-broker-login(LoginActionsService),包含get,post
    • 重定向到/{realm}/broker/after-first-broker-login(IdentityBrokerService)行綁定后的流程
    • 重定向到/{realm}/login-actions/post-broker-login
    • 重定向到/{realm}/broker/after-post-broker-login

回調地址的擴展

  • 當社區認證成功后,會跳轉到keycloak的社區認證流
  • 當keycloak社區認證流完成后,會走到標準認證流
  • 標準認證流完成后,會重寫向到來源頁,并帶上keycloak的code碼
  • 這時,來源頁上有且只有code碼這個參數,如果希望擴展url上的參數,我們需要以下步驟

在社區回調地址上添加loginType參數

  • org.keycloak.services.resources.IdentityBrokerService.finishBrokerAuthentication()方法添加對loginType的操作
private Response finishBrokerAuthentication(BrokeredIdentityContext context, UserModel federatedUser,
                                              AuthenticationSessionModel authSession, String providerId) {
    authSession.setAuthNote(AuthenticationProcessor.BROKER_SESSION_ID, context.getBrokerSessionId());
    authSession.setAuthNote(AuthenticationProcessor.BROKER_USER_ID, context.getBrokerUserId());

    this.event.user(federatedUser);

    context.getIdp().authenticationFinished(authSession, context);
    authSession.setUserSessionNote("loginType", providerId);
    ...
}
  • org.keycloak.protocol.oidc.OIDCLoginProtocol.authenticated()方法中,獲取loginType,并添加到回調路徑的URL參數中
  code = OAuth2CodeParser.persistCode(session, clientSession, codeData);
  redirectUri.addParam(OAuth2Constants.CODE, code);
  // TODO: 登錄成功后,將用戶登錄方式追加到回調頁面上
  if (authSession.getUserSessionNotes().containsKey("loginType")) {
    String loginType = authSession.getUserSessionNotes().get("loginType");
    redirectUri.addParam("loginType", loginType);
  }

FEDERATED_IDENTITY_LINK的完善

  • 默認的綁定消息,內容比較少,不滿足我們的需求
{
  "time": 1723099954167,
  "type": "FEDERATED_IDENTITY_LINK",
  "realmId": "fabao",
  "clientId": "pkulaw",
  "userId": "e62a4ea6-c1c3-4f10-9136-8ceebba45339",
  "sessionId": null,
  "ipAddress": "111.198.143.194",
  "error": null,
  "details": {
    "identity_provider": "carsi",
    "identity_provider_identity": "student@pku.edu.cn",
    "code_id": "6668189e-4cd6-488e-8582-d28b87636b41",
    "username": "phone202408081431274571"
  }
}

擴展消息,需要按以下步驟操作

  • 在org.keycloak.services.resources.IdentityBrokerService.afterFirstBrokerLogin方法中添加以下代碼
  // 社區綁定現在有用戶后,發的事件FEDERATED_IDENTITY_LINK,我們需要添加一些擴展信息
  event.detail(Details.IDENTITY_PROVIDER, providerId);
  event.detail(Details.IDENTITY_PROVIDER_USERNAME, context.getBrokerUserId()); //event.detail(Details.IDENTITY_PROVIDER_USERNAME, context.getUsername());
  event.detail("identity_provider_username", context.getUsername());
  • 添加之后,我們為FEDERATED_IDENTITY_LINK事件消息添加identity_provider_username
{
  "time": 1723101725866,
  "type": "FEDERATED_IDENTITY_LINK",
  "realmId": "fabao",
  "clientId": "pkulaw",
  "userId": "347c9e9e-076c-45e3-be74-c482fffcc6e5",
  "sessionId": null,
  "ipAddress": "10.10.80.81",
  "error": null,
  "details": {
    "identity_provider": "carsi",
    "identity_provider_username": "student@pku.edu.cn",
    "identity_provider_identity": "6zETJRPrWiBi7B85cCHPoVD7dyI\u003d",
    "code_id": "c344f279-9786-468b-a67e-fecf39c531b0",
    "username": "test"
  }
}

第一認證流first broken flow獲取社區認證的用戶信息

  • 在認證提供者中,通過extractIdentityFromProfile方法將社區用戶返回的JsonNode對象進行解析
  • 將解析后的字段,賦值并建立BrokeredIdentityContext對象,在方法setUserAttribute()添加對象的用戶屬性
  • 在第一認證流中,authenticateImpl方法中,參數BrokeredIdentityContext brokerContext就是之前你賦過值的對象
// SocialIdentityProvider認證子類的代碼
@Override
protected BrokeredIdentityContext extractIdentityFromProfile(EventBuilder event, JsonNode profile) {
      BrokeredIdentityContext user = new BrokeredIdentityContext(unionId);
      user.setUsername(unionId);
      user.setBrokerUserId(unionId);
    
      //將內容更新到用戶表,未綁定本地用戶時,這些信息可以傳遞到first-broker-flow里
      user.setUserAttribute("weichatUnionId", unionId);
      
      //...
}

// AbstractIdpAuthenticator子類實現的第一認證流,在社區用戶沒有和本地keycloak用戶綁定時,會走這個類
protected void authenticateImpl(AuthenticationFlowContext context, SerializedBrokeredIdentityContext serializedCtx,
                                  BrokeredIdentityContext brokerContext) {
if (brokerContext.getUserAttribute("weichatUnionId") != null) {
      // 用戶屬性
      userModel.setSingleAttribute("weichatUnionId", brokerContext.getUserAttribute("weichatUnionId"));
      // token屬性
      context.getAuthenticationSession()
          .setUserSessionNote("weichatUnionId", brokerContext.getUserAttribute("weichatUnionId"));
    }
                                      
 }

執行過程截圖

社區用戶未綁定kc用戶

社區新用戶綁定kc用戶登錄截圖

社區用戶已經綁定了kc用戶

社區已綁定kc用戶登錄截圖

posted @ 2024-08-08 15:38  張占嶺  閱讀(394)  評論(0)    收藏  舉報