实现百度第三方登录(Android Studio)
对于第一次开发第三方登录的开发者而言,学习百度账号的第三方登录相对来说没有实现qq,微信那么繁琐,更适合初学者学习。
说明:实现百度第三方登录与实现qq的流程是一样的,只不过qq的申请为开发者认证比较麻烦。百度可直接申请为开发者。
具体流程:
通过实现三次握手来实现第三方登录;
1.登录到百度开发者中心。
2.注册百度账号,成为百度开发者。
3.需要把项目添加到开发者工程中。
4.在百度开发者中心创建工程。
4.在百度开发者中心创建工程。
4.安全设置
第一次握手:可在自己创建的工程中查看API文档需要如下几个参数
登录页面:
<a href="http://openapi.baidu.com/oauth/2.0/authorize?client_id=API Key&response_type=code&redirect_uri=http://localhost:8090/project/loginSuccess">
<button type="button" class="btn btn-danger">第三方百度登录</button></a>
最终实现:
第一次握手:可在自己创建的工程中查看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
登录页面:
<a href="http://openapi.baidu.com/oauth/2.0/authorize?client_id=API Key&response_type=code&redirect_uri=http://localhost:8090/project/loginSuccess">
<button type="button" class="btn btn-danger">第三方百度登录</button></a>
最终实现:
点击跳转到自己项目专有的一个登录页面,登陆成功,跳转到自己的项目中。
(第一次握手只能获取到code码,获取不到用户信息)
把随机数code再次发送给百度,获取令牌Access_Token
第二次握手
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=
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;
}
第二次握手
通过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;
}