<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      keycloak~關(guān)于社區(qū)登錄的過程說明

      keycloak將第三方登錄(社區(qū)登錄)進行了封裝,大體主要會經(jīng)歷以下三個過程:

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

      從登錄到回調(diào)

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

      回調(diào)地址的擴展

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

      在社區(qū)回調(diào)地址上添加loginType參數(shù)

      • 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,并添加到回調(diào)路徑的URL參數(shù)中
        code = OAuth2CodeParser.persistCode(session, clientSession, codeData);
        redirectUri.addParam(OAuth2Constants.CODE, code);
        // TODO: 登錄成功后,將用戶登錄方式追加到回調(diào)頁面上
        if (authSession.getUserSessionNotes().containsKey("loginType")) {
          String loginType = authSession.getUserSessionNotes().get("loginType");
          redirectUri.addParam("loginType", loginType);
        }
      

      FEDERATED_IDENTITY_LINK的完善

      • 默認的綁定消息,內(nèi)容比較少,不滿足我們的需求
      {
        "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方法中添加以下代碼
        // 社區(qū)綁定現(xiàn)在有用戶后,發(fā)的事件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());
      
      • 添加之后,我們?yōu)镕EDERATED_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獲取社區(qū)認證的用戶信息

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

      執(zhí)行過程截圖

      社區(qū)用戶未綁定kc用戶

      社區(qū)新用戶綁定kc用戶登錄截圖

      社區(qū)用戶已經(jīng)綁定了kc用戶

      社區(qū)已綁定kc用戶登錄截圖

      posted @ 2024-08-08 15:38  張占嶺  閱讀(393)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 福利视频一区二区在线| 91精品国产免费人成网站| 日韩高清砖码一二区在线| 欧美日韩国产va在线观看免费| 国产又色又爽无遮挡免费动态图| AV最新高清无码专区| 久久精品免视看国产成人| 国产成人亚洲综合色婷婷秒播| 少妇人妻偷人精品系列| 黄色国产精品一区二区三区| 亚洲第一狼人天堂网伊人| 欧美乱大交aaaa片if| 欧美成人www免费全部网站| 亚洲一区二区三区在线激情| 日韩有码中文在线观看| 国产亚洲AV电影院之毛片| 色视频不卡一区二区三区| 91精品久久久久久无码人妻| 午夜国产理论大片高清| 国产精品 亚洲一区二区三区| 亚洲精品一区二区三区色| 日日猛噜噜狠狠扒开双腿小说| 国语精品国内自产视频| 久久天天躁狠狠躁夜夜avapp| 亚洲国产精品自在拍在线播放蜜臀 | 资阳市| 国产亚洲999精品aa片在线爽 | 欧美国产日韩久久mv| 日韩伦理片| 亚洲av成人久久18禁| 狠狠躁夜夜躁人人爽天天古典| 中国女人高潮hd| 日韩内射美女人妻一区二区三区| 亚洲综合精品成人| 动漫精品专区一区二区三区| 国产偷国产偷亚洲高清午夜| 91高清免费国产自产拍| 毛多水多高潮高清视频| 亚洲中文字幕无码av永久| 国产一区精品在线免费看| 亚洲色丰满少妇高潮18p|