Java Web集成第三方登錄

g2md 9年前發布 | 182K 次閱讀 登錄 OpenID/單點登錄SSO

最近的項目涉及到網站的第三方登錄,總結了下發現有的地方配置還是很麻煩,所以把過程貼出來供大家參考。

百度開發者平臺

對于一般的應用,使用百度開放服務平臺這樣的平臺提供的社會化服務即可滿足用戶的日常使用需要。
首先打開:
百度開放服務平臺
點擊右上角的:管理控制臺——開發者服務管理
進入開發者服務管理后可以新建自己的工程。
建立好后如下圖所示:
基本信息
百度會提供一個API key和一個密鑰,這個一會兒會用,先打開顯示更多——社會化服務。
這里寫圖片描述
首先進入回調地址設置,填寫第三方登錄成功后的action地址:
這里寫圖片描述
注意這里的地址不能寫成localhost,必須是127.0.0.1。
填寫完成后回到上一頁,打開“PC端JS組件設置”。
這里寫圖片描述
這里可以自己設置下第三方登錄的網站以及樣式,設置好以后點擊生成頁面js代碼。
這里寫圖片描述

<script type="text/javascript" id="bd_soc_login_boot"></script>
<script type="text/javascript">
(function(){
  var t = new Date().getTime(),
      script = document.getElementById("bd_soc_login_boot"),
      redirect_uri = encodeURIComponent("替換為登錄成功后的url"),
      domid = "替換為登錄組件的目標節點id",
      src = "http://openapi.baidu.com/social/oauth/2.0/connect/login?redirect_uri=" + redirect_uri + "&domid=" + domid + "&client_type=web&response_type=code&media_types=sinaweibo%2Cqqdenglu%2Cbaidu%2Crenren&size=-1&button_type=4&client_id=ozLMOCp1zcUE25HbRrR0UKrl&view=embedded&t=" + t;
    script.src = src;
})();
</script>

生成代碼后copy到項目的登錄頁面即可,在登錄框下新建個div節點同js保持一致。最終樣式如下:
這里寫圖片描述

下面為登陸成功后的action:

public class SocialLogin extends HttpServlet {

@Override
protected void service(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession();
    UserDao userDao = (UserDao) DaoFactory.getInstance("UserDao");
    UserInfoService userInfoService = (UserInfoService) ServiceFactory
            .getInstance("UserInfoService");
    // 接收code
    String code = request.getParameter("code");

    // 發送post請求,根據code獲取token
    Map<String, String> map = new HashMap<String, String>();
    map.put("grant_type", "authorization_code");
    map.put("code", code);
    map.put("client_id", "ozLMOCp1zcUE25HbRrR0UKrl");
    map.put("client_secret", "a08tWipbc42UAj0ERipVNi1Npdq3Y5I8");
    map.put("redirect_uri", "http://127.0.0.1/LSZ/socialLogin");

    String json = HttpUtils.postForm(
            "https://openapi.baidu.com/social/oauth/2.0/token", map);
    // 令牌
    String access_token = JSONObject.fromObject(json).get("access_token")
            .toString();
    // 獲取用戶信息
    String json2 = HttpUtils
            .get("https://openapi.baidu.com/social/api/2.0/user/info?access_token="
                    + access_token + "&");

    // 用戶名
    String username = JSONObject.fromObject(json2).get("username")
            .toString();
    System.out.println(username);

    // 唯一ID
    String social_uid = JSONObject.fromObject(json2).get("social_uid")
            .toString();
    System.out.println(social_uid);

    /*
     * Boolean flag = service.getUser(Integer.parseInt(social_uid));
     * System.out.println(flag);
     */
    //下面是該項目的注冊及登錄方法,可以選擇無視
    // if (flag) {
    User user = new User();
    user.setUsername(username);
    UserService userService = (UserService) ServiceFactory
            .getInstance("UserService");
    try {
        Boolean isRegist = userDao.findUser(username);
        if (isRegist) {
            // 已注冊直接登錄
            user = userService.login(username, social_uid, 1);
            int userType = user.getUserState();
            int u_id = user.getU_id();
            UserInfo userInfo = userInfoService.ser_findInfo(u_id);
            session.setAttribute("userInfo", userInfo);
            session.setAttribute("u_id", u_id);
            session.setAttribute("username", username);
            session.setAttribute("userType", userType);
            response.sendRedirect("index.do");
        } else {
            // 未注冊首先注冊
            boolean isRegist2 = userService.regist(username, social_uid, 1);
            // 完成注冊后默認該用戶已經登錄
            user = userService.login(username, social_uid, 1);
            int u_id = user.getU_id();
            boolean isIntro = true;
            // 通過u_id自動生成一個u_info的記錄,只含有u_id和i_id
            boolean isInfo = userInfoService.ser_newUserInfo(u_id);
            // 再通過u_id獲得這條記錄
            UserInfo userInfo = userInfoService.ser_findInfo(u_id);
            if (isRegist2 && isInfo && (userInfo != null)) {
                session.setAttribute("isIntro", isIntro);
                session.setAttribute("userInfo", userInfo);
                session.setAttribute("username", username);
                session.setAttribute("u_id", u_id);
                response.sendRedirect("index.do");
            }
        }

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //
    // user.setSocial_uid(Integer.parseInt(social_uid));
    // service.saveUser(user);
    // System.out.println("保存用戶信息成功");
    // } else {
    // User user = service.getUser2(social_uid);
    // System.out.println("讀取用戶信息成功");
    // }

}

}</pre>
在第三方登錄的時候會生成一個social_uid,唯一,用來驗證用戶,該social_uid可以存在用戶表中單獨一列,讓用戶登錄后重新設置密碼,也可以將該social_uid直接設置為密碼,但以后登錄時只能使用第三方。

來自:http://blog.csdn.net/tryitboy/article/details/48173827

 本文由用戶 g2md 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!