Github第三方登陆详细流程及实现

一、 流程图

二、具体实现步骤

Ⅰ、创建OAuth App

  1. 我们首先需要创建一个OAuth App,根据下图的步骤点击即可

  1. 依次填写信息,然后点Register application

  1. 然后我们可以看到会生成一个id和密码,后面我们会用得到,尽量不要让别人看到了(我这里是测试用的,后续会删除)

Ⅱ、写后台代码,我这里用Spring Boot

  1. 写一个超链接用作登陆按钮,以及两个实体类
<a href="https://github.com/login/oauth/authorize?client_id=你的client_id&redirect_uri=http://localhost:8080/callback&state=1">登陆</a>
public class AccessTokenDto {
private String client_id; //客户端ID。
private String client_secret; //客户端密钥
private String code; //作为对步骤 1 的响应而接收的代码。
private String redirect_uri; //应用程序中的用户在授权后发送的URL
private String state; //在步骤 1 中提供的不可猜测的随机字符串
//省略getter setter
}
public class GithubUser {
private Long id;
private String name;
private String bio;
//省略getter setter
}
  1. Controller
@Controller
public class AuthoriseController { @Autowired
private GithubProvider githubProvider; @Autowired
private GithubParams githubParams; @GetMapping("/callback")
public String callback(@RequestParam("code") String code,
@RequestParam("state") String state){
AccessTokenDto accessTokenDto = new AccessTokenDto();
accessTokenDto.setClient_id(githubParams.getClient_id());
accessTokenDto.setClient_secret(githubParams.getClient_secret());
accessTokenDto.setCode(code);
accessTokenDto.setRedirect_uri(githubParams.getRedirect_uri());
accessTokenDto.setState(state);
//获取access_token
String access_token = githubProvider.getAccessToken(accessTokenDto);
//根据accessToken获取用户信息
GithubUser githubUser = githubProvider.getGithubUser(access_token);
System.out.println(githubUser.getName()); return "index";
}
}
  1. 你需要导入两个maven依赖
<!--引入OKHTTP,发送请求-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.6.0</version>
</dependency> <!--引入fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
  1. GithubProvider(用于获取access_token和user信息)
@Component
public class GithubProvider {
@Autowired
private GithubParams githubParams; /**
* 获取AccessToken
*/
public String getAccessToken(AccessTokenDto accessTokenDto) {
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
//将accessTokenDto转为json字符串传入参数
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(accessTokenDto));
Request request = new Request.Builder()
.url(githubParams.getToken_uri())
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
String str = response.body().string();
//得到的是类似这样的字符串,我们需要将它分割,只要access_token部分
//access_token=9566ba3483a556c610be42d44338f3fd16a3b8d1&scope=&token_type=bearer
return str.split("&")[0].split("=")[1];
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* 根据access_token获取用户信息
*/
public GithubUser getGithubUser(String access_token) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(githubParams.getUser_uri() + "?access_token=" + access_token)
.build(); try (Response response = client.newCall(request).execute()) {
//得到的是json字符串,因此需要转为GithubUser对象
return JSON.parseObject(response.body().string(), GithubUser.class);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
  1. GithubParams,配置参数
@Component
@ConfigurationProperties(prefix = "github")
public class GithubParams { private String client_id;
private String client_secret;
private String redirect_uri;
private String token_uri;
private String user_uri;
//省略getter setter
}
  1. 配置文件application.properties
server.port=8087
github.client_id=你生成的id
github.client_secret=你生成的密码
github.redirect_uri=http://localhost:8887/callback
github.token_uri=https://github.com/login/oauth/access_token
github.user_uri=http://localhost:8887/callback

三、运行效果

github访问稍慢,请耐心等待

看你的控制台,正常情况下会输出你的Github设置的姓名

四、文献

参考:Github官方文档

Github第三方登陆详细流程的更多相关文章

  1. Oauth2.0 QQ&微信&微博实现第三方登陆

    一.写在前面 目前对于大多数的App或Web网站都支持有第三方登陆这个功能,用户可使用 QQ/ 微信/ 微博 帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户.最近在新项目上刚好用到了,在 ...

  2. 网站添加第三方登陆(PHP版)

    这两周正在写毕业设计,我做的是一个问答网站.先介绍一下这个网站:这是一个关于大学生在线问答的网站,类似知乎和百度知道,不过功能没有人家多,毕竟这个网站我一个人在做.网站部署在阿里云,网站包括API,W ...

  3. C#网站实现QQ第三方登陆# C#快速开发教程

    C#网站实现QQ第三方登陆 说起在网站上面可以直接使用QQ登录功能大家并不陌生.但翻其官方提供的SDK包中却没有C#方向的. 但是我们有个牛人叫张善友,做了一个民间SDK.下面我们就是用他所写的SDK ...

  4. ShareSDK第三方登陆 (IOS)

    1.http://www.mob.com/ 注册申请 2.http://www.mob.com/#/download SDK下载  (简洁版:http://www.mob.com/#/download ...

  5. QQ互联第三方登陆 redirect uri is illegal(100010)

    想必第一次大家接触QQ第三方登陆都会遇到各种各样的问题,备受折磨,因此,今天我把自己做QQ登陆的过程描述一下,希望给大家提供参考,少走弯路. 在开发之前,我们先了解下QQ登陆的流程 第一:查看熟悉 网 ...

  6. 安卓高级9 shareSDK 第三方登陆和分享Mob

    ShareSDK推荐此官网地址 官网注册和申请key流程 注册 略 进入后台创建应用得到可以 下载SDK 解压下载的压缩包 第三方平台申请key 如果你想申请QQ登陆或者分享需要去腾讯开发者申请,申请 ...

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

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

  8. uni-app第三方登陆-微信

    结合上文全局登陆校验,实现微信授权登录官方手册地址: https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo 一.书写两个界面 login. ...

  9. Django之第三方登陆模块

    Django之第三方登陆模块 前期准备 安装 django-allauth pip install django-allauth 注意,django-allauth 需要在 Django1.10以上版 ...

随机推荐

  1. 浅谈Linux下/etc/passwd文件

    浅谈Linux 下/etc/passwd文件 看过了很多渗透测试的文章,发现在很多文章中都会有/etc/passwd这个文件,那么,这个文件中到底有些什么内容呢?下面我们来详细的介绍一下. 在Linu ...

  2. IOS系统唤醒微信内置地图

    针对前一篇文章 唤醒微信内置地图 后来发现在IOS系统中运行 唤醒地图会无效的问题.因为在IOS上无法解析这俩个字符串的问题! 需要对经纬度 使用 “parseFloat()”进行转换 返回一个浮点数 ...

  3. [MariaDB]MHA高可用部署-实验

    目录 一.简介 1.1MHA角色 二.MHA的工具 三.MHA部署过程 3.1.1 配置 3.1.2 环境规划 3.1.3 配置一主多从 3.2 MHA配置 3.2.1 master权限授予 3.2. ...

  4. 源码详解系列(六) ------ 全面讲解druid的使用和源码

    简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...

  5. C#反射与特性(五):类型成员操作

    目录 1,MemberInfo 1.1 练习-获取类型的成员以及输出信息 1.2 MemberType 枚举 1.3 MemberInfo 获取成员方法并且调用 1.4 获取继承中方法的信息(Decl ...

  6. Docker——WIN7 安装 Docker实战与入门

    1.Docker简介 Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Lin ...

  7. php部署后错误排查流程

    未使用框架的php程序不可用时,没有框架提供的调试信息,因此要按照请求的整个生命周期来调试程序, 具体错误依次排查网络,服务器,环境,代码的步骤层层深入,最终定位到错误的发生点. 1 访问程序部署的服 ...

  8. 云资源中的低成本战斗机——竞价实例,AWS、阿里云等六家云厂商完全用户使用指南

    云端资源价格 预留实例:长期持有,批发路线,价格最便宜. 按需实例:即买即用,零售路线,价格最贵. 这两种资源,基于不同区域/价格的六家云厂商价格对比,连同原始数据文档我们已经打包成了一份电子文档,有 ...

  9. 通过例子进阶学习C++(五)计算2的1次方至2的64次方之和

    本文是通过例子学习C++的第五篇,通过这个例子可以快速入门c++相关的语法. 1.上篇回顾 在上一篇中,我们通过字符数组计算264次方: 通过例子进阶学习C++(四)计算2的64次方 带着这个问题:为 ...

  10. spark和mapreduce的区别

    spark和mapreduced 的区别map的时候处理的时候要落地磁盘 每一步都会落地磁盘 reduced端去拉去的话 基于磁盘的迭代spark是直接再内存中进行处理 dag 执行引擎是一个job的 ...