今天我们继续学习:Github授权第三方登录,前面我们已经学习了 码云(Gitee)授权第三方登录,Github授权第三方登录的实现过程其实和 码云(Gitee)授权第三方登录的实现过程类似,只是有一些细节需要注意,下面我们就一起来学习吧

一、准备工作

  • 1、登录 Github 官网

首先我们得有自己的一个 githu 账号,我们到 github 的官网进行注册或者登录

官网地址:https://github.com/

登录成功后:

  • 2、创建应用

在下拉菜单中找到 “Settings”,设置

然后找到 “Developer settings”,开发人员设置

找到“OAuth Apps”,我们就可以开始创建我们的授权应用了,在右上角点击“New OAuth APP”

我们填好应用基本信息,点击“Register application”,我们便创建好了应用,点击应用,我们便可以拿到应用的 appid 和 appkey

  • 3、将应用信息保存到项目中


由于我使用的是 SpringBoot 项目,我放在了 application.yml 文件中

二、开始开发

  • 1、引入 Maven 依赖
<!-- 网络请求 -->
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.6</version>
</dependency>
<!-- alibaba的fastjson -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.51</version>
</dependency>

其余的依赖请自行加入

  • 2、在页面放置 “Github” 授权登录的 DOM 元素
<a th:href="@{github/auth}" class="link" title="Github登录"><i class="iconfont icon-github"></i></a>

这里使用的是阿里的 iconfont 图标

三、接口类

创建 “Github” 授权登录的 Controller,GithubController.java

  • 1、从配置文件中获取 “Github” 配置信息
/*** github授权中提供的 appid 和 appkey*/
@Value("${github.oauth.clientid}")
public String CLIENTID;
@Value("${github.oauth.clientsecret}")
public String CLIENTSECRET;
@Value("${github.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 CodeString url = "https://github.com/login/oauth/authorize?scope=user" +"&client_id=" + CLIENTID +"&redirect_uri=" + URLEncoder.encode(URL) +"&state=" + uuid;return PasswordUtils.redirectTo(url);
}

接口文档中建议我们在授权登录时传入一个加密的数据防止被攻击,我们传入了UUID,最后重定向到授权页面

  • 3、当该用户点击“授权”按钮,同意授权后,就会回调到我们在应用中填写的回调地址里去
/*** 授权回调*/
@GetMapping(value = "/callback")
public String qqCallback(HttpServletRequest request) throws Exception {HttpSession session = request.getSession();// 得到Authorization CodeString 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 TokenString url = "https://github.com/login/oauth/access_token?" +"client_id=" + CLIENTID +"&client_secret=" + CLIENTSECRET +"&redirect_uri=" + URL +"&code=" + code +"&state=" + state;JSONObject accessTokenJson = GithubHttpClient.getAccessToken(url);// Step3: 获取用户信息/*url = "https://api.github.com/user?access_token=" + accessTokenJson.getString("access_token");*/url = "https://api.github.com/user";JSONObject jsonObject = GithubHttpClient.getUserInfo(url, accessTokenJson.getString("access_token"));/*** TODO 获取到用户信息之后,你自己的业务逻辑* 判断数据库是否有次用户,有---登录成功,无---保存用户至数据库,登录成功*/return PasswordUtils.redirectTo("/success");
}

四、网络请求方法

上面回调方法中所用到的网络接口方法,我放在了 GithubHttpClient.java 文件中,主要有两个方法

  • 1、使用 code 获取Access Token
/*** 获取Access Token* post*/
public static JSONObject getAccessToken(String url) throws IOException {HttpClient client = HttpClients.createDefault();HttpPost httpPost = new HttpPost(url);httpPost.setHeader("Accept", "application/json");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;
}

我们在请求头中传入了

httpPost.setHeader("Accept", "application/json");

是希望返回 JSON 格式的数据,code 直接拼接在了 url 上

  • 2、使用 Access Token 获取用户信息
/*** 获取用户信息* get*/
public static JSONObject getUserInfo(String url, String token) throws IOException {CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet(url);httpGet.setHeader("Accept", "application/json");httpGet.setHeader("Authorization", "token " + token);HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if (entity != null) {String result = EntityUtils.toString(entity, "UTF-8");return JSONObject.parseObject(result);}httpGet.releaseConnection();return null;
}

获取用户信息这一步,官方给的文档是:

注意:这里我们在请求头中传入 token,API 文档中描述不够清楚,这里看了好几遍才明白,掉坑儿里了

httpGet.setHeader("Authorization", "token " + token);

最终我们获取到一个 JSON 对象,该对象包含了用户的信息,例如:id,name,email,phone 等等。

  • 3、官网 OAuth API 文档
https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/#web-application-flow

五、总结

该授权认证过程符合 OAuth2 认证基本流程,流程如下:

1、用户点击页面登录按钮,请求授权页面,用户在此页面登录账号并同意授权
2、用户同意授权后,回调至我们项目中,首先验证 state 是否一致
3、使用上一步拿到的 code 请求 access_token
4、使用 access_token 请求 用户信息,完成授权登录过程

如您在阅读中发现不足,欢迎留言!!!

下一篇:

【第三方互联】十五、百度(baidu)授权第三方登录

如您在阅读中发现不足,欢迎留言!!!

【第三方互联】14、Github授权第三方登录相关推荐

  1. 【第三方互联】13、码云(Gitee)授权第三方登录

    今天我们来学习:码云(Gitee)授权第三方登录,相比之前 支付宝登录.腾讯QQ登录 以及 新浪微博登录 来说,相对于比较简单 一.准备工作 1.登录 码云官网 官网地址:https://gitee. ...

  2. 【第三方互联】9、新浪微博(sina)授权第三方登录

    当我们创建的新浪微博互联应用成功后,我们便可以开始使用该应用来实现新浪微博授权操作 一.获取 App Key 和 App Secret 1.在"我的应用",点击应用,查看我们创建的 ...

  3. 【第三方互联】3、腾讯QQ授权第三方登录

    当我们创建的 QQ 互联应用成功后,我们便可以开始使用该应用来实现 QQ 互联 一.获取 APP ID 和 APP Key 1.在 QQ 互联官网首页找到"我的应用" 2.点击应用 ...

  4. 【第三方互联】16、微信(wechat)授权第三方登录

    第三方平台系列文章,今天终于又开始更新了,今天继续学习微信(wechat)授权第三方登录 一.准备工作 1.申请微信公众测试号 由于我们是个人开发者,我们需要去注册申请一个微信公众平台的测试号 htt ...

  5. 微博授权第三方网站登录

    大致流程如下图所述 前置工作 去微博开放平台上(https://open.weibo.com/)申请网站接入 审核通过后会给你的应用分配 App Key 和 App Secret (后续根据授权码获取 ...

  6. 【第三方互联】11、创建支付宝(Alipay)互联应用

    我们已经注册成为了 支付宝 的开发者,这时我们便可以来创建应用进行开发 一.开发中心 我们登录了 支付宝 开发平台之后,我们在顶部菜单找到开发者中心 我这里选择自定义接入网页&移动应用,用来做 ...

  7. 【第三方互联】10、注册成为支付宝(Alipay)开发者

    之前我们已经学习了QQ.新浪微博的第三方授权登录,今天继续学习支付宝的第三方授权登录 比起QQ与新浪微博的操作,支付宝授权增加了获取公钥.私钥等操作 一.访问 支付宝开放平台 官网地址:https:/ ...

  8. sau交流学习社区第三方登陆github--oauth来实现用户登录

    sau交流学习社区第三方登陆github--oauth来实现用户登录 最近在丰富nodejsBlog开发的"交流学习社区"(https://www.mwcxs.top)的其他功能以 ...

  9. 【第三方互联】8、创建新浪微博(sina)互联应用

    当我们注册新浪微博开发者通过审核之后,我们才能创建应用 当我们开发者认证审核通过之后,我们的身份认证状态将变为:"已认证",这时,我们便可以创建微连接应用了 一.创建应用 这里我们 ...

  10. SpringBoot 整合oauth2实现授权第三方应用(实战版)

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 11 分钟. 来自:blog.csdn.net/u014365523/article/details/112317015 什么 ...

最新文章

  1. 竞赛人必备的100篇NLP论文
  2. SAP PM 初级系列25 - 维修工单与采购单据之间LINK?
  3. java linkedlist 查找_Java中LinkedList真的是查找慢增删快
  4. 【响应式Web前端设计】CSS3伪类与伪元素的区别
  5. 软件工程硕士和计算机硕士论文题目,计算机硕士毕业论文答辩自述
  6. CentOS 安装宋体字体
  7. FM实现F4帮助系列三:弹出框多筛选…
  8. imagePreview接口调用微信自带图片播放器
  9. python selenium po_python+selenium基于po模式的web自动化测试框架
  10. SQLcode错误代码汇总和sqlstate=37000的解决方案
  11. mysql 排序查询核心
  12. ps 命令查看进程状态
  13. 说说微信聊天记录收费这件事
  14. throw er; // Unhandled 'error' event 和Error: listen EADDRNOTAVAIL 192.168.0.109:8081
  15. LR预设王家卫港风胶片复古调色滤镜支持PR/PS/FCPX/达芬奇/AE/LUT
  16. APICloud入门初体验
  17. TSP问题(贪心法)最近邻点和最短连接
  18. 五款实用的项目管理软件
  19. 计算机二级模板文档,江苏省计算机二级
  20. 用python写个根据提示猜词语简单的游戏_python实现简单猜单词游戏

热门文章

  1. 分治法查找最大和次大元素
  2. 如何打开CMD界面呢?打开CMD界面有四种方式。
  3. 无法和 SFTP 服务器建立 FTP 连接,请选择合适的协议。
  4. 《Java多线程编程实战》——第2章 设计模式及其作用
  5. 什么人适合学习大数据开发?学大数据难吗?
  6. 【渝粤题库】陕西师范大学210033 劳动法与社会保障法作业
  7. Drupal采集,Drupal文章采集爬虫采集插件(附图文)
  8. python输入1234输出4321_求一个C语言程序:输入正整数,要求以相反数顺序输出该数。如输入1234,输出4321....
  9. springboot+easypoi excel表格多个sheet导出
  10. 二进制转化成ascll_如何将二进制文件转换为ASCII