Java 实现 Github 第三方登陆
前言
最近公司需要做一系列第三方登录,其中一个就是Github的第三方登录,这里就把过程记录下来,方便日后温习,也希望能给读者提供一些帮助。
技术
主要还是调用Github 的 Rest API v3 接口, 所以只要能有http客户端能够发送请求就可以,业务实现就看个人自己啦。
我这边采用的是SpringBoot
的一系列框架。 http请求是使用 Spring中的RestTemplate来发送的。
准备工作
- 首先在Github->Settings->Developer Settings 页面右上角点击 New OAuth App
New OAuth App 页面
- 其中
Application name
会在请求用户授权的时候显示,Authorization callback URL
填写的地址会在用户授权成功后跳转
这里填写的信息之后都可以再次修改
- 在创建完OAuth App后 我们可以在 Developer Settings 页面看到我们新建的APP了,进入查看详情,我们需要关注比较重要的3个参数。
名称 | 备注 | Example |
---|---|---|
Client ID | OAuth App的账户 | 9f232c210ed1cada9a9b |
Client Secret | OAuth App的密码 | 不告诉你 |
Authorization callback URL | 请求用户授权成功后会重定向跳转的地址 | http://localhost:8080/github.html |
正文
我们的需求是能够在网页上登录的时候使用Github OAuth Login 所以我们就采用 Web Application flow 的方法。
根据文档说明,Web应用认证流程分为以下几步:
- 用户被第三方客户端(也就是我们的应用)重定向至Github官网请求用户授权。
- 用户被Github带上短暂有效的code重定向回第三方客户端( 根据Authorization callback URL 指定的地址。
- 第三方客户端 可以带着通过code向Github换取的用户token访问Github API 得到用户的资源。
1. 请求用户授权
名称 | 必填 | 备注 | Example |
---|---|---|---|
client_id | 是 | OAuth APP的Client ID;不记得的话往上翻 | 9f232c210ed1cada9a9b |
scope | 否 | 请求用户授权的作用域;列表 | user,gist,repo, write:public_key |
redirect_uri | 否 | 授权后要跳转的地址;若是填了那么第二步请求也应该填相同的值 | |
state | 否 | 用于防止攻击的随机码;若是填了那么第二步请求也应该填相同的值 | |
allow_signup | 否 | 用于是否允许用户现在Github注册再进一步进行授权,默认是true
|
根据文档说明,我们要获得用户授权的方式就是将用户重定向至Github的授权页面。
GET
- https://github.com/login/oauth/authorize
那么这里有几个参数是至关重要的
名称 | 必填 | 备注 | Example |
---|---|---|---|
client_id | 是 | OAuth APP的Client ID;不记得的话往上翻 | 9f232c210ed1cada9a9b |
scope | 否 | 请求用户授权的作用域;列表 | user,gist,repo, write:public_key |
redirect_uri | 否 | 授权后要跳转的地址;若是填了那么第二步请求也应该填相同的值 | |
state | 否 | 用于防止攻击的随机码;若是填了那么第二步请求也应该填相同的值 | |
allow_signup | 否 | 用于是否允许用户现在Github注册再进一步进行授权,默认是true
|
恩,那么说明有了,剩下就要举个栗子:
https://github.com/login/oauth/authorize?client_id=9f232c210ed1cada9a9b&scopes=user,repo,admin:public_key
在进行授权之后,就会带上code跳转至callback URL
例:
http://localhost:8080/github.html?code=21f82602133f1a4ee2c4
2. 处理code换取用户access_token
名称 | 必填 | 备注 | Example |
---|---|---|---|
client_id | 是 | OAuth APP的Client ID;不记得的话往上翻 | 9f232c210ed1cada9a9b |
client_secret | 是 | OAuth APP的Client Secret;不记得的话往上翻 | 不告诉你 |
code | 是 | 第一步返回来的code | 21f82602133f1a4ee2c4 |
redirect_uri | 否 | 授权后要跳转的地址;若是填了那么第二步请求也应该填相同的值 | |
state | 否 | 用于防止攻击的随机码;若是填了那么第二步请求也应该填相同的值 |
这里换取access_token的地址呢就是
post
- https://github.com/login/oauth/access_token
参数说明:
名称 | 必填 | 备注 | Example |
---|---|---|---|
client_id | 是 | OAuth APP的Client ID;不记得的话往上翻 | 9f232c210ed1cada9a9b |
client_secret | 是 | OAuth APP的Client Secret;不记得的话往上翻 | 不告诉你 |
code | 是 | 第一步返回来的code | 21f82602133f1a4ee2c4 |
redirect_uri | 否 | 授权后要跳转的地址;若是填了那么第二步请求也应该填相同的值 | |
state | 否 | 用于防止攻击的随机码;若是填了那么第二步请求也应该填相同的值 |
在这一步中 我们就要通过java调用restTemplate去Github服务器请求Github 用户的access_token
// 代码之后补上哦
3. 至此结束
得到access_token后我们就可以愉快的去访问Github API啦,如果出现权限不够的情况,那么就请回到第一步去根据需要调整scope
啦
顺便介绍一下在在Github API请求中带token的几种方法
- Headers
在Http Headers中设置
Key | Value |
---|---|
Authorization | token ${access_token} |
- URL Params
在访问的URL中带上参数access_token=${access_token}
例如:
https://api.github.com/user?access_token=${access_token}