今天我们来学习:码云(Gitee)授权第三方登录,相比之前 支付宝登录、腾讯QQ登录 以及 新浪微博登录 来说,相对于比较简单
一、准备工作
1、登录 码云官网
官网地址:https://gitee.com/
注册、登录我们的账号
2、创建应用
在右上角菜单找到 “设置” 选项
在 “安全设置” 下找到 “第三方应用”
点击 “创建应用” 开始创建第三方应用
按照要求填写应用信息即可
3、将应用信息保存到项目中
由于我使用的是 SpringBoot 项目,我放在了 application.yml 文件中
二、开始开发
1、引入 Maven 依赖
org.apache.httpcomponents
httpclient
4.5.6
com.alibaba
fastjson
1.2.51
其余的依赖请自行加入
2、在页面放置 “码云(Gitee)” 授权登录的 DOM 元素
这里使用的是阿里的 iconfont 图标
三、创建 “码云(Gitee)” 授权登录的 Controller,GiteeController.java
1、从配置文件中获取 “码云(Gitee)” 配置信息
/**
* gitee授权中提供的 appid 和 appkey
*/
@Value("${gitee.oauth.clientid}")
public String CLIENTID;
@Value("${gitee.oauth.clientsecret}")
public String CLIENTSECRET;
@Value("${gitee.oauth.callback}")
public String URL;
2、页面登录按钮点击后的接口
/**
* 请求授权页面
*/
@GetMapping(value = "/auth")
public String qqAuth(HttpSession session) {
// 用于第三方应用防止CSRF攻击
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
session.setAttribute("state", uuid);
// Step1:获取Authorization Code
String url = "https://gitee.com/oauth/authorize?response_type=code" +
"&client_id=" + CLIENTID +
"&redirect_uri=" + URLEncoder.encode(URL) +
"&state=" + uuid +
"&scope=user_info";
return PasswordUtils.redirectTo(url);
}
接口文档中建议我们在授权登录时传入一个加密的数据防止被攻击,我们传入了UUID,最后重定向到授权页面
/**
* 授权回调
*/
@GetMapping(value = "/callback")
public String qqCallback(HttpServletRequest request) throws Exception {
HttpSession session = request.getSession();
// 得到Authorization Code
String code = request.getParameter("code");
// 我们放在地址中的状态码
String state = request.getParameter("state");
String uuid = (String) session.getAttribute("state");
// 验证信息我们发送的状态码
if (null != uuid) {
// 状态码不正确,直接返回登录页面
if (!uuid.equals(state)) {
return PasswordUtils.redirectTo("/login");
}
}
// Step2:通过Authorization Code获取Access Token
String url = "https://gitee.com/oauth/token?grant_type=authorization_code" +
"&client_id=" + CLIENTID +
"&client_secret=" + CLIENTSECRET +
"&code=" + code +
"&redirect_uri=" + URL;
JSONObject accessTokenJson = GiteeHttpClient.getAccessToken(url);
// Step3: 获取用户信息
url = "https://gitee.com/api/v5/user?access_token=" + accessTokenJson.get("access_token");
JSONObject jsonObject = GiteeHttpClient.getUserInfo(url);
/**
* 获取到用户信息之后,就该写你自己的业务逻辑了
*/
return PasswordUtils.redirectTo("/success");
}
四、上面回调方法中所用到的网络接口方法,我放在了 GiteeHttpClient.java 文件中,主要有两个方法
1、网络接口
/**
* 获取Access Token
* post
*/
public static JSONObject getAccessToken(String url) throws IOException {
HttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
HttpResponse response = client.execute(httpPost);
HttpEntity entity = response.getEntity();
if (null != entity) {
String result = EntityUtils.toString(entity, "UTF-8");
return JSONObject.parseObject(result);
}
httpPost.releaseConnection();
return null;
}
/**
* 获取用户信息
* get
*/
public static JSONObject getUserInfo(String url) throws IOException {
JSONObject jsonObject = null;
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
HttpResponse response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity, "UTF-8");
jsonObject = JSONObject.parseObject(result);
}
httpGet.releaseConnection();
return jsonObject;
}
分别就是使用 code 获取 token,在使用 token 获取 用户信息
注意:我们需要在请求时加上请求头
User-Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
最终我们获取到一个 JSON 对象,该对象包含了用户的信息,例如:id,name,email,phone 等等。
2、官方 OAuth 文档https://gitee.com/api/v5/oauth_doc#/
五、总结
该授权认证过程符合 OAuth2 认证基本流程,流程如下:
1、用户点击页面登录按钮,请求授权页面,用户在此页面登录账号并同意授权
2、用户同意授权后,回调至我们项目中,首先验证 state 是否一致
3、使用上一步拿到的 code 请求 access_token
4、使用 access_token 请求 用户信息,完成授权登录过程
如您在阅读中发现不足,欢迎留言!!!