原生java代碼實(shí)現(xiàn)碼云第三方驗(yàn)證登錄的示例代碼
碼云第三方驗(yàn)證登錄
研究了QQ,碼云,微信等第三方登錄接口時(shí),發(fā)現(xiàn)QQ以及微信第一步都需要驗(yàn)證授權(quán)管理,而且個(gè)人測(cè)試需要提供手持身份證一張,并且驗(yàn)證時(shí)間過(guò)長(zhǎng)( 3天工作日左右吧 ),這樣會(huì)非常浪費(fèi)大家學(xué)習(xí)第三方接口登錄的時(shí)間,終于, 在我的不屑努力下,找到了適合大家快速上手,測(cè)試第三方接口登錄的平臺(tái)-————碼云(看網(wǎng)上帖子說(shuō)某WX接入還要開發(fā)者認(rèn)證,人民幣300元)
碼云鏈接地址
https://gitee.com/
一、在碼云上創(chuàng)建應(yīng)用
1、在碼云上注冊(cè)一個(gè)賬號(hào),點(diǎn)擊右上角設(shè)置

2、創(chuàng)建應(yīng)用

3、填寫資料
很多同學(xué)不太了解什么是應(yīng)用回調(diào)地址webhooks(第三方登錄成功后,會(huì)返回到你指定的地址,并且攜帶驗(yàn)證是否成功的參數(shù)信息)

4、獲取到clientId以及client Secret
clientId和client Sercret的主要作用是通過(guò)拼接得到請(qǐng)求地址,將地址重定向至授權(quán)登錄頁(yè)面


準(zhǔn)備過(guò)程已完成
二、在項(xiàng)目中實(shí)現(xiàn)第三方登錄
大概流程

1、導(dǎo)入依賴jar包
<!--servlet服務(wù)-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!--第三方登錄插件包-->
<dependency>
<groupId>me.zhyd.oauth</groupId>
<artifactId>JustAuth</artifactId>
<version>1.3.2</version>
</dependency>
<!--服務(wù)器發(fā)送get,post工具包-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
2、跳轉(zhuǎn)授權(quán)頁(yè)面
AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
.clientId(CLIENT_ID) //Client ID
.clientSecret(CLIENT_SECRET) //Client Secret
.redirectUri(REDIRECTURI) //回調(diào)地址
.build());
String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
//跳轉(zhuǎn)到授權(quán)頁(yè)面
response.sendRedirect(authorizeUrl);
3、通過(guò)回調(diào)地址獲取到code值
//http://localhost:8080/login?actionName=giteeCode&code=e063730161cd40cf&state=25c74eba2ac5f
String code = request.getParameter("code");
4、再將用戶授權(quán)碼發(fā)送碼云服務(wù)器
補(bǔ)充一個(gè)小小的坑,碼云第三方驗(yàn)證需要加上header信息,否則會(huì)報(bào)403錯(cuò)誤
String url = "https://gitee.com/oauth/token?grant_type=authorization_code&code="+code+"&client_id="+CLIENT_ID+"&redirect_uri="+REDIRECTURI+"&client_secret="+CLIENT_SECRET;
Map<String,String> map = new HashMap<>();
map.put("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)");
JSONObject s = HttpUtils.post(url,map);
授權(quán)登錄失敗會(huì)返回message錯(cuò)誤信息,標(biāo)識(shí)登錄失敗
成功:
{
"access_token":"e386e20327b7c4",
"refresh_token":"057c79c2d1f957a5cb4d",
"scope":"user_info",
"created_at":15488,
"token_type":"bearer",
"expires_in":86400
}
5、獲取碼云用戶信息
通過(guò)授權(quán)碼獲取到的json數(shù)據(jù),其中access_token參數(shù),可以訪問(wèn)碼云的用戶數(shù)據(jù)
//https://gitee.com/api/v5/user?access_token=*******
String access_token = s.getString("access_token");
String url2 = "https://gitee.com/api/v5/user?access_token="+access_token;
JSONObject user = HttpUtils.get(url2,map);
//1、設(shè)置響應(yīng)類型輸出流
response.setContentType("application/json;charset=UTF-8");
//2、將json轉(zhuǎn)為字符串
String str = JSON.toJSONString(user);
//3、得到字符輸出流
response.getWriter().write(str);
源碼:
在這小編要說(shuō)一下回調(diào)地址操作1和回調(diào)地址操作2的區(qū)別
操作1:小編使用的是服務(wù)器的get,post發(fā)送請(qǐng)求,而跳轉(zhuǎn)“授權(quán)頁(yè)面”(giteeLogin 方法)使用的是插件,各位看主大大也可手動(dòng)改為get請(qǐng)求,跳轉(zhuǎn)第三方登錄頁(yè)面,具體get地址請(qǐng)參考
碼云oauth文檔
其中A和B步驟,修改后就可以不用插件代碼跳轉(zhuǎn)授權(quán)頁(yè)面
操作2:完全使用的是JustAuth插件實(shí)現(xiàn)第三方登錄
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.shsxt.utils.HttpUtils;
import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.request.AuthGiteeRequest;
import me.zhyd.oauth.request.AuthRequest;
import me.zhyd.oauth.utils.AuthStateUtils;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//ac85a173bb89ee
private final String CLIENT_ID = “Client ID”
private final String CLIENT_SECRET= “Client Secret”
private final String REDIRECTURI = “回調(diào)地址”
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取用戶行為
String actionName = request.getParameter("actionName");
//判斷用戶行為
if("giteeLogin".equals(actionName)) {
//如果發(fā)送碼云授權(quán)驗(yàn)證
giteeLogin(request,response);
}else if("giteeCode".equals(actionName)) {
//giteeCode(request,response);
giteeCode2(request,response);
}
System.out.println("點(diǎn)擊了");
}
/**
* 回調(diào)地址后的操作1
* @param request
* @param response
*/
private void giteeCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
//獲取code
String code = request.getParameter("code");
String url = "https://gitee.com/oauth/token?grant_type=authorization_code&code="+code+"&client_id="+CLIENT_ID+"&redirect_uri="+REDIRECTURI+"&client_secret="+CLIENT_SECRET;
Map<String,String> map = new HashMap<>();
map.put("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)");
JSONObject s = HttpUtils.post(url,map);
System.out.println(s);
//https://gitee.com/api/v5/user?access_token=*******
String access_token = s.getString("access_token");
String url2 = "https://gitee.com/api/v5/user?access_token="+access_token;
JSONObject user = HttpUtils.get(url2,map);
//1、設(shè)置響應(yīng)類型輸出流
response.setContentType("application/json;charset=UTF-8");
//2、將json轉(zhuǎn)為字符串
String str = JSON.toJSONString(user);
//3、得到字符輸出流
response.getWriter().write(str);
}
/**
* 回調(diào)地址后的操作2
* @param request
* @param response
*/
private void giteeCode2(HttpServletRequest request, HttpServletResponse response) throws IOException {
String code = request.getParameter("code");
AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
.clientId(CLIENT_ID) //Client ID
.clientSecret(CLIENT_SECRET) //Client Secret
.redirectUri(REDIRECTURI) //回調(diào)地址
.build());
AuthResponse json = authRequest.login(code);
System.out.println(json);
}
/**
* 跳轉(zhuǎn)授權(quán)頁(yè)面
* @param request
* @param response
*/
private void giteeLogin(HttpServletRequest request, HttpServletResponse response) throws IOException {
//跳轉(zhuǎn)授權(quán)頁(yè)面
AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
.clientId(CLIENT_ID) //Client ID
.clientSecret(CLIENT_SECRET) //Client Secret
.redirectUri(REDIRECTURI) //回調(diào)地址
.build());
String authorizeUrl = authRequest.authorize();
//跳轉(zhuǎn)到授權(quán)頁(yè)面
response.sendRedirect(authorizeUrl);
}
}
服務(wù)器發(fā)送get/post請(qǐng)求工具類
package com.shsxt.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Set;
public class HttpUtils {
/*
*發(fā)送簡(jiǎn)單post請(qǐng)求
*/
public static JSONObject post(String url) {
HttpPost post = new HttpPost(url);
return getResult(post);
}
/*
*發(fā)送帶Header的post請(qǐng)求
*/
public static JSONObject post(String url, Map<String, String> map) {
HttpPost post = new HttpPost(url);
if (!map.isEmpty()) {
Set<Map.Entry<String, String>> entrys = map.entrySet();
for (Map.Entry<String, String> entry : entrys) {
post.setHeader(entry.getKey(), entry.getValue());
}
}
return getResult(post);
}
/*
*發(fā)送帶Header的get請(qǐng)求
*/
public static JSONObject get(String url, Map<String, String> map) {
HttpGet get = new HttpGet(url);
if (!map.isEmpty()) {
Set<Map.Entry<String, String>> entrys = map.entrySet();
for (Map.Entry<String, String> entry : entrys) {
get.setHeader(entry.getKey(), entry.getValue());
}
}
return getResult(get);
}
/*
*發(fā)送簡(jiǎn)單的get請(qǐng)求
*/
public static JSONObject get(String url) {
HttpGet get = new HttpGet(url);
return getResult(get);
}
/*
*發(fā)送請(qǐng)求方法,請(qǐng)求響應(yīng)為JSONObject
*/
private static JSONObject getResult(HttpRequestBase requestBase) {
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = null;
try {
result = EntityUtils.toString(httpClient.execute(requestBase).getEntity());
result = new String(result.getBytes("ISO-8859-1"),"utf-8");
httpClient.close();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (ClientProtocolException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
return new JSONObject(JSON.parseObject(result));
}
}
/*
*當(dāng)請(qǐng)求響應(yīng)為String時(shí)
*/
public static String getString(String url) {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet get = new HttpGet(url);
String result = null;
try {
result = EntityUtils.toString(httpClient.execute(get).getEntity());
httpClient.close();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (ClientProtocolException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
return result;
}
}
}
```*當(dāng)請(qǐng)求響應(yīng)為String時(shí)
*/
public static String getString(String url) {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet get = new HttpGet(url);
String result = null;
try {
result = EntityUtils.toString(httpClient.execute(get).getEntity());
httpClient.close();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (ClientProtocolException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
return result;
}
}
}
前端頁(yè)面

總結(jié)
到此這篇關(guān)于原生java代碼實(shí)現(xiàn)碼云第三方驗(yàn)證登錄的示例代碼的文章就介紹到這了,更多相關(guān)java碼云第三方驗(yàn)證登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java8 使用 stream().sorted()對(duì)List集合進(jìn)行排序的操作
這篇文章主要介紹了Java8 使用 stream().sorted()對(duì)List集合進(jìn)行排序的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
hadoop的hdfs文件操作實(shí)現(xiàn)上傳文件到hdfs
這篇文章主要介紹了使用hadoop的API對(duì)HDFS上的文件訪問(wèn),其中包括上傳文件到HDFS上、從HDFS上下載文件和刪除HDFS上的文件,需要的朋友可以參考下2014-03-03
SSM項(xiàng)目使用攔截器實(shí)現(xiàn)登錄驗(yàn)證功能
這篇文章主要介紹了在SSM項(xiàng)目中如何使用攔截器,實(shí)現(xiàn)登錄驗(yàn)證功能。文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的小伙伴可以了解一下2022-01-01
Java實(shí)現(xiàn)漢字轉(zhuǎn)全拼音的方法總結(jié)
在軟件開發(fā)中,經(jīng)常會(huì)遇到需要將漢字轉(zhuǎn)換成拼音的場(chǎng)景,比如在搜索引擎優(yōu)化、數(shù)據(jù)存儲(chǔ)、國(guó)際化等方面,Java作為一種廣泛使用的編程語(yǔ)言,提供了多種方法來(lái)實(shí)現(xiàn)漢字到拼音的轉(zhuǎn)換,本文將詳細(xì)介紹幾種常用的Java漢字轉(zhuǎn)全拼音的方法,并提供具體的代碼示例和步驟2024-12-12
Spring注解中@Configuration和@Component到底有啥區(qū)別
之前一直搞不清@Component和@Configuration這兩個(gè)注解到底有啥區(qū)別,一直認(rèn)為被這兩修飾的類可以被Spring實(shí)例化嘛,最近終于弄明白了,這篇文章主要給大家介紹了關(guān)于Spring注解中@Configuration和@Component到底有啥區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-04-04
Spring?Boot?項(xiàng)目中?JPA?語(yǔ)法的基本使用方法
這篇文章主要介紹了?Spring?Boot?項(xiàng)目中?JPA?語(yǔ)法的基本使用方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10
springboot接口接收數(shù)組及多個(gè)參數(shù)的問(wèn)題及解決
這篇文章主要介紹了springboot接口接收數(shù)組及多個(gè)參數(shù)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

