Java Web集成第三方登录

g2md 9年前

最近的项目涉及到网站的第三方登录,总结了下发现有的地方配置还是很麻烦,所以把过程贴出来供大家参考。

百度开发者平台

对于一般的应用,使用百度开放服务平台这样的平台提供的社会化服务即可满足用户的日常使用需要。
首先打开:
百度开放服务平台
点击右上角的:管理控制台——开发者服务管理
进入开发者服务管理后可以新建自己的工程。
建立好后如下图所示:
基本信息
百度会提供一个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("读取用户信息成功");          // }        }    }

在第三方登录的时候会生成一个social_uid,唯一,用来验证用户,该social_uid可以存在用户表中单独一列,让用户登录后重新设置密码,也可以将该social_uid直接设置为密码,但以后登录时只能使用第三方。

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