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. mysql oracle sql获取树 父级 子级 及自己

    select * from ( select t.*,d.TABLE_NAME,d.QUERY_SQL,d.data_control_col,d.id table_id,d.where_sql fro ...

  2. JS 中检测数组的四种方法

    今天和大家分享一下 JS 中检测是不是数组的四种方法,虽然篇幅不长,不过方法应该算是比较全面了. 1. instanceof 方法 instanceof 用于检测一个对象是不是某个类的实例,数组也是一 ...

  3. C#中的结构体和对象区别

    经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字class 定义结构使用关键字str ...

  4. linux文件通配符

    * #匹配任意字符 ? #匹配任意单个字符 ~ #当前用户家目录 ~user #用户user的家目录 ~+ #当前工作目录 ~- #前一个工作目录 [0-9] #匹配的数字范围 [a-z] #匹配小写 ...

  5. 键盘优雅弹出与ios光标乱飘解决方案

    前言 在移动开发中,会遇到这样的情况,比如说有一个输入框在最底部的时候,我们弹起输入框,输入框不会在输入键盘上. 说明白简单点就是,输入框被键盘挡住了.而且在原生中,输入框应该正好在输入键盘上,但是h ...

  6. FJUT-1370 记录一次解题过程

    题目在福工院的1370 首先看题目,好家伙,全英文 那么大致的题意就是.有几个城市同在一条线上(相当于在x轴上),max i是第i个城市到其他所有城市的距离中的最大值,min i也就是所有中最小的. ...

  7. Go 每日一库之 fsnotify

    简介 上一篇文章Go 每日一库之 viper中,我们介绍了 viper 可以监听文件修改进而自动重新加载. 其内部使用的就是fsnotify这个库,它是跨平台的.今天我们就来介绍一下它. 快速使用 先 ...

  8. IDEA中springboot的热部署

    在pom.xml文件中添加依赖 <!--添加热部署--> <dependency> <groupId>org.springframework.boot</gr ...

  9. rabbitmq 实现延迟队列的两种方式

    原文地址:https://blog.csdn.net/u014308482/article/details/53036770 ps: 文章里面延迟队列=延时队列 什么是延迟队列 延迟队列存储的对象肯定 ...

  10. nodejs 执行 最近 发现 nodejs 执行的 是非等待的。

    上一步结果 没有完成 下一步就执行了 结果就 不行