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官方文档

最新文章

  1. MySQL 专用备份软件参考
  2. 网站iis日志分析工具
  3. Unity4.3 bug GetChild顺序错乱
  4. 【WPF】TextBox样式重写注意事项
  5. transform的用法和注意事项
  6. (转)QML代码与现有Qt UI代码整合
  7. 夺命雷公狗ThinkPHP项目之----企业网站25之网站前台面包屑导航URL的完善
  8. [SQL]sql介绍
  9. 一个简单WPF登陆界面,包含记住密码,自动登录等功能,简洁美观
  10. HTML5初学者福利!11个在线学习网站推荐
  11. Java反射机制学习
  12. ASP.Net请求处理机制初步探索之旅 - Part 1 前奏(转)
  13. javascript语句语义大全(2)
  14. [心得]传统IT转互联网面试经验分享
  15. C#基础——结构体
  16. onmouseover与onmouseenter区别
  17. LOJ#2249 购票
  18. 转载 --- SKLearn中预测准确率函数介绍
  19. VM克隆后找不到eth0的问题解决
  20. 用网站把图标做成iconFont文件引用

热门文章

  1. ThinkPHP5——接入腾讯云短信API
  2. C++ | C++ 基础知识 | 指针、数组与引用
  3. YOLOv3 K-means获取anchors大小
  4. cogs 1316. 数列操作B 区间修改 单点查询
  5. JMeter——分布式压测
  6. 安全检测检查清单(Web)网站
  7. excel中为什么不显示单引号
  8. 2.Markdown学习
  9. (转)宽字节编码类型的XSS
  10. MyBatis-Plus学习笔记(1):环境搭建以及基本的CRUD操作