GitHub第三方登录实现效果如下:

实现流程如下:

1.注册一个GitHub账号
2.注册一个授权的网站保存一个你的Client ID和Client Secret
3.准备一个页面,有一个链接跳转到授权的页面<a href="https://github.com/login/oauth/authorize?client_id=xx&state=STATE&redirect_uri=xx">GitHub登录</a>
4.准备controller去处理callback回调的请求① 获取到请求参数中的code② 拿到code去发送请求请求token③ 拿到token发送请求请求用户信息④ 将用户信息做持久化处理(放到请求范围中)⑤ 在主页面通过el表单获取到前面取到的用户信息...

OAuth2.0的认证原理

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth是Open Authorization的简写,目前的版本是2.0版。  https://oauth.net/2/ 

GitHub第三方登录的认证授权流程

申请 Client ID 和 ClientSecret

首先到GitHub官网注册账号: https://github.com/

登录:https://github.com/login

登录进去之后点击你的头像,选择Settings

选择左下方的Developer settings创建一个应用

注册应用之后,可以获取到 Client ID 和 Client Secret

申请clientID和clientSecret的用途???

clientID:应用的唯一标识。

clientSecretclientID对应的密钥,访问用户资源时用来验证应用的合法性。

申请地址: https://github.com/settings/developers

注意:clientIDclientSecret信息进行保密,不要随意泄漏。

GitHub的登录授权实现

第三方登录流程是:先获取code --> 然后获取access_token --> 根据token获取用户信息。

前台页面实现步骤:点击登录按钮 --> 打开一个窗口,进行授权 --> 授权完成,跳转到首页或上次浏览的页面。

前台准备一个页面,有一个链接跳转到GitHub的授权页面

https://github.com/login/oauth/authorize?client_id=xx&state=xx&redirect_uri=xx;

点击跳转到GitHub第三方登录页面

登录账号进行授权

授权之后就会跳转到自己之前创建应用时设置的回调路径

温馨小提示:如果是本地测试可将回调地址修改成本地路径

温馨小提示:可在GitHub上 https://github.com/settings/applications 取消授权的应用

登录就算完成了,那么我们怎么去获取用户信息来实现我们的其他功能呢??比如获取用户账号,头像等信息绑定到自己系统的数据库里面

代码实现   (温馨小提示:这里我将代码都一个文件了,有3个类,需要自己弄出来哦)

package com.zhengqing.web.controller;import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;@Controller
public class GitHubCallBackController {//授权成功后的回调,我们需要在这个方法中拿到code去请求token@RequestMapping("/callback")public String callback(String code, String state) throws Exception{//获取到code和stateSystem.out.println("code:"+code);System.out.println("state:"+state);if(!StringUtils.isEmpty(code)&&!StringUtils.isEmpty(state)){//拿到我们的code,去请求token//发送一个请求到String token_url = GitHubConstants.TOKEN_URL.replace("CLIENT_ID", GitHubConstants.CLIENT_ID).replace("CLIENT_SECRET", GitHubConstants.CLIENT_SECRET).replace("CALLBACK", GitHubConstants.CALLBACK).replace("CODE", code);
//           System.out.println("用户信息数据"+token_url);//这个里面有我们想要的用户信息数据String responseStr = HttpClientUtils.doGet(token_url);String token = HttpClientUtils.parseResponseEntity(responseStr).get("access_token");//根据token发送请求获取登录人的信息String userinfo_url = GitHubConstants.USER_INFO_URL.replace("TOKEN", token);responseStr = HttpClientUtils.doGet(userinfo_url);//jsonMap<String, String> responseMap = HttpClientUtils.parseResponseEntityJSON(responseStr);System.out.println("登录用户信息:"+responseMap);//responseMap里面保存着用户登录信息System.out.println("获取登录用户的用户名:"+responseMap.get("login"));}return "main";// TODO 修改成自己需要返回的页面...}
}
//抽取出来的参数【代码拷贝下来只需要修改成自己的CLIENT_ID,Client CLIENT_SECRET,CALLBACK即可】
class GitHubConstants {public static final String CLIENT_ID = "xx"; // TODO 修改成自己的public static final String CLIENT_SECRET = "xx";  // TODO 修改成自己的public static final String CALLBACK = "xx";  // TODO 修改成自己的  [注意:callback要和注册的回调路径保持一致  否则登录授权之后会报NullPointerException]//获取code的urlpublic static final String CODE_URL = "https://github.com/login/oauth/authorize?client_id=CLIENT_ID&state=STATE&redirect_uri=CALLBACK";//获取token的urlpublic static final String TOKEN_URL = "https://github.com/login/oauth/access_token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&code=CODE&redirect_uri=CALLBACK";//获取用户信息的urlpublic static final String USER_INFO_URL = "https://api.github.com/user?access_token=TOKEN";
}
//工具类
class HttpClientUtils {/*** 使用HttpClient发送一个Get方式的请求* @param url 请求的路径 请求参数拼接到url后面* @return 响应的数据* @throws Exception*/public static String doGet(String url)throws Exception{CloseableHttpClient httpclient = HttpClients.createDefault();HttpGet httpGet = new HttpGet(url);CloseableHttpResponse response = httpclient.execute(httpGet); //发送一个http请求//如果响应成功,解析响应结果if(response.getStatusLine().getStatusCode()==200){HttpEntity responseEntity = response.getEntity(); //获取响应的内容return EntityUtils.toString(responseEntity);}return null;}// 参数的封装public static Map<String,String> parseResponseEntity(String responseEntityStr){Map<String,String> map = new HashMap<>();String[] strs = responseEntityStr.split("\\&");for (String str : strs) {String[] mapStrs = str.split("=");String value = null;String key = mapStrs[0];if(mapStrs.length>1){value = mapStrs[1];}map.put(key, value);}return map;}//json字符串转mappublic static Map<String,String> parseResponseEntityJSON(String responseEntityStr){Map<String,String> map = new HashMap<>();JSONObject jsonObject = JSONObject.parseObject(responseEntityStr); //解析json格式的字符串Set<Map.Entry<String, Object>> entries = jsonObject.entrySet();for (Map.Entry<String, Object> entry : entries) {String key = entry.getKey();String value = String.valueOf(entry.getValue());map.put(key, value);}return map;}}

maven项目中还需要额外引入如下,其余的就是自己项目的配置,比如上面的代码是springmvc配置通过 @Controller 进行跳转...

    <!-- GitHub第三方登录所需 --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.6</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency>

可直接拷贝到自己的项目中使用哦,注意修改以下部分哦

以及注意这个 responseMap 里面封装了我们想要的用户信息数据哦

ex:repos_url里面有很多我们想要的数据

代码最后运行结果: 可根据自己的需求去拿数据

Java实现GitHub第三方登录详解相关推荐

  1. Android第三方登录详解2

    接着Android第三方登录详解1讲 1.找到友盟  文档中心 2.找到 3.将 UMSocialService mController = UMServiceFactory.getUMSocialS ...

  2. 使用QQ互联完成网站的QQ第三方登录(详解+坑)

    前言:网站收尾工作,就只剩下第三方登录,去QQ互联注册,提交资料,审核了快一周,创建应用,一直创建不了,后来才发现是QQ互联的问题,耽误了两天又开始创建应用,终于弄好了,建议大家使用QQ第三方的,一定 ...

  3. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  4. Java对接微信公众平台详解

    Java对接微信公众平台详解 1.公众平台概述 1.1 公众平台概述 1.2 入门指引 2.对接流程 2.1 接入概述 2.2 填写服务器配置 2.3 接口域名说明 2.4 获取Access toke ...

  5. Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

    Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...

  6. Java开发常见面试题详解(JVM)_2

    Java开发常见面试题详解(JVM)_2 JVM 问题 详解 JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots link 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认 ...

  7. Spring Boot 接入 GitHub 第三方登录,只要两行配置!

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:14 个 github 项目!个人原创100W +访问量博客:点击前往,查看更多 本文地址:https://www ...

  8. 转:Java 7 种阻塞队列详解

    转自: Java 7 种阻塞队列详解 - 云+社区 - 腾讯云队列(Queue)是一种经常使用的集合.Queue 实际上是实现了一个先进先出(FIFO:First In First Out)的有序表. ...

  9. java none怎么用tomcat_在docker中部署tomcat并且部署java应用程序的步骤详解

    先给大家简单说下Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是 ...

最新文章

  1. python合并两个有序列表(list)
  2. Java与C#平台通信 WCF CXF SOAP
  3. Github霸榜月余,原来是阿里技术官的千亿级并发系统设计手册上线了
  4. highcharts 动态生成x轴和折线图
  5. 新建虚拟机与window的连接
  6. householder变换qr分解matlab_【基础教程】Matlab实现傅里叶变换
  7. lede 自定义linux,OpenWrt 和 LEDE 宣布正式合并
  8. NOIP2005复赛 普及组 第1题 陶陶摘苹果
  9. iOS 自定义控件 progressView(环形进度条)
  10. mysqlin索引失效的情况
  11. “花书”的佐餐,你的线性代数笔记
  12. php 上传文件大小设置,调整PHP上传文件大小限制
  13. Efficient Low-rank Multimodal Fusion with Modality-Specific Factors 论文
  14. 星起航跨境:美国市场8月份在线价格同比上涨0.4%
  15. 前端promise、async重点总结
  16. 商业计划书的完整结构
  17. 使用Picasso加载图片的内存优化实践
  18. 人工智能基础——什么是人工智能
  19. Python绘图:turtle库基础语法介绍
  20. python hank_python学习路线

热门文章

  1. 遍历dataframe每一行的每一个元素
  2. 史蒂芬·乔布斯05年在斯坦福大学毕业典礼上的演讲精彩片段
  3. ITIL 4存在的必要性
  4. table表格中实现圆角效果
  5. Springboot注入RestTemplate异常Field restTemplate in xxx.ApiRestUtils required a bea
  6. REBOL 中 Bind 的理解
  7. day01、2 - 虚拟化与虚拟机的安全
  8. 魔众文库系统 v2.3.0 后台菜单快捷搜索,组件显示优化
  9. 钉钉支持鸿蒙系统,鸿蒙系统
  10. 双目相机IMX219-83 +jetson nano 使用教程