第三方登录(百度账号登录)

实现百度第三方登录(Android Studio)

对于第一次开发第三方登录的开发者而言,学习百度账号的第三方登录相对来说没有实现qq,微信那么繁琐,更适合初学者学习。

说明:实现百度第三方登录与实现qq的流程是一样的,只不过qq的申请为开发者认证比较麻烦。百度可直接申请为开发者。

具体流程:

通过实现三次握手来实现第三方登录;

1.登录到百度开发者中心。
2.注册百度账号,成为百度开发者。
3.需要把项目添加到开发者工程中。
4.在百度开发者中心创建工程。
第三方登录(百度账号登录)_第1张图片

4.安全设置
第一次握手:可在自己创建的工程中查看API文档需要如下几个参数
  • client_id:必须参数,注册应用时获得的API Key。
  • response_type:必须参数,此值固定为“code”。
  • redirect_uri:必须参数,授权后要回调的URI,即接收Authorization Code的URI。如果用户在授权过程中取消授权,会回调该URI,并在URI末尾附上error=access_denied参数。对于无Web Server的应用,其值可以是“oob”,此时用户同意授权后,授权服务会将Authorization Code直接显示在响应页面的页面中及页面title中。非“oob”值的redirect_uri按照如下规则进行匹配:
    https: //openapi.baidu.com/oauth/2.0/authorize? response_type=code&client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect&scope=email&display=popu

登录页面:

     

最终实现:
点击跳转到自己项目专有的一个登录页面,登陆成功,跳转到自己的项目中。
(第一次握手只能获取到code码,获取不到用户信息)
把随机数code再次发送给百度,获取令牌Access_Token
第二次握手

通过Authorization Code获取Access Token

  • grant_type:必须参数,此值固定为“authorization_code”;
  • code:必须参数,通过上面第一步所获得的Authorization Code;
  • client_id:必须参数,应用的API Key;
  • client_secret:必须参数,'应用的Secret Key;
  • redirect_uri:必须参数,该值必须与获取Authorization Code时传递的“redirect_uri”保持一致。

        例如:

https://openapi.baidu.com/oauth/2.0/token?
	grant_type=authorization_code&
	code=ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn&
	client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
	client_secret=0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&
	redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect

controller
    @RequestMapping("/loginSuccess")
    public String loginSuccess(String code,HttpServletRequest request){
        System.out.println(code);
        try {
            /* 第二次握手 */
            //把随机数code再次发送给百度,获取令牌Access_Token
            //通过httpClient向百度发送请求
            CloseableHttpClient httpClient = HttpClients.createDefault();
            //创建一个post请求
            HttpPost postReq = new HttpPost("https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code="+code+"&client_id=
Va5yQRHlA4Fq4eR3LT0vuXV4
&client_secret=
0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2
&redirect_uri=http://localhost:8090/project/loginSuccess");
            postReq.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8    ");
            postReq.addHeader("Accept-Encoding", "gzip, deflate, br");
            postReq.addHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
            postReq.addHeader("Connection", "keep-alive");
            postReq.addHeader("Host", "openapi.baidu.com");
            postReq.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0");
            //执行post请求
            CloseableHttpResponse response;
            
            response = httpClient.execute(postReq);
            //获取响应信息
            HttpEntity entity = response.getEntity();
            //把响应信息转换成字符串
            String content = EntityUtils.toString(entity,"UTF-8");
            System.out.println("第二次握手"+content);
            //转为json对象,调属性
            Baidu baidu = JSONObject.parseObject(content, Baidu.class);
            System.out.println("token令牌"+baidu.getAccess_token());
            /* 第三次握手 */
             //发送请求,获取用户信息,需要参数Token令牌(调用户信息接口)
//再将令牌Access_Token发送给百度,获取用户信息。
           HttpPost postReq2 = new HttpPost("https://openapi.baidu.com/rest/2.0/passport/users/getLoggedInUser?access_token="+baidu.getAccess_token());
            
            postReq2.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8    ");
            postReq2.addHeader("Accept-Encoding", "gzip, deflate, br");
            postReq2.addHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
            postReq2.addHeader("Connection", "keep-alive");
            postReq2.addHeader("Host", "openapi.baidu.com");
            postReq2.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0");
            CloseableHttpResponse response2 = httpClient.execute(postReq2);
            HttpEntity entity2 = response2.getEntity();  
            String content2 = EntityUtils.toString(entity2,"UTF-8");
            System.out.println("第三次握手"+content2);
            //转为json对象,调属性
            BaiduUserInfo userInfo = JSONObject.parseObject(content2, BaiduUserInfo.class);
            System.out.println(userInfo.getUid());
            //判断这个用户的uid在数据库中是否存在,存在说明这个百度用户与数据库用户是绑定的
            User user = loginservice.checkedUserByUid(userInfo.getUid());//后台查询,返回user对象
            //然后判断,存在登录成功,不存在返回到登录页面
            if(user==null){
                return "redirect:index.jsp";
            }else{
                request.getSession().setAttribute("user", user);
                return "/WEB-INF/user/success";
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }





你可能感兴趣的:(第三方登录(百度账号登录))