原生java代碼實(shí)現(xià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接入還要開(kāi)發(fā)者認(rèn)證,人民幣300元)碼云鏈接地址https://gitee.com/
一、在碼云上創(chuàng)建應(yīng)用1、在碼云上注冊(cè)一個(gè)賬號(hào),點(diǎn)擊右上角設(shè)置很多同學(xué)不太了解什么是應(yīng)用回調(diào)地址webhooks(第三方登錄成功后,會(huì)返回到你指定的地址,并且攜帶驗(yàn)證是否成功的參數(shù)信息)
clientId和client Sercret的主要作用是通過(guò)拼接得到請(qǐng)求地址,將地址重定向至授權(quán)登錄頁(yè)面
準(zhǔn)備過(guò)程已完成
二、在項(xiàng)目中實(shí)現(xiàn)第三方登錄大概流程
<!--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 {//獲取codeString 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è)面
到此這篇關(guān)于原生java代碼實(shí)現(xiàn)碼云第三方驗(yàn)證登錄的示例代碼的文章就介紹到這了,更多相關(guān)java碼云第三方驗(yàn)證登錄內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. XML入門(mén)精解之結(jié)構(gòu)與語(yǔ)法2. 利用CSS3新特性創(chuàng)建透明邊框三角3. XML解析錯(cuò)誤:未組織好 的解決辦法4. XML入門(mén)的常見(jiàn)問(wèn)題(二)5. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)6. HTML5 Canvas繪制圖形從入門(mén)到精通7. CSS Hack大全-教你如何區(qū)分出IE6-IE10、FireFox、Chrome、Opera8. 概述IE和SQL2k開(kāi)發(fā)一個(gè)XML聊天程序9. HTML DOM setInterval和clearInterval方法案例詳解10. XML入門(mén)的常見(jiàn)問(wèn)題(一)
