前言
最近公司需要做一系列第三方登錄权旷,其中一個就是Github的第三方登錄织盼,這里就把過程記錄下來闻牡,方便日后溫習(xí),也希望能給讀者提供一些幫助俺亮。
技術(shù)
主要還是調(diào)用Github 的 Rest API v3 接口, 所以只要能有http客戶端能夠發(fā)送請求就可以驮捍,業(yè)務(wù)實(shí)現(xiàn)就看個人自己啦。
我這邊采用的是SpringBoot
的一系列框架脚曾。 http請求是使用 Spring中的RestTemplate來發(fā)送的东且。
準(zhǔn)備工作
- 首先在Github->Settings->Developer Settings 頁面右上角點(diǎn)擊 New OAuth App
New OAuth App 頁面 - 其中
Application name
會在請求用戶授權(quán)的時候顯示,Authorization callback URL
填寫的地址會在用戶授權(quán)成功后跳轉(zhuǎn)
這里填寫的信息之后都可以再次修改
- 在創(chuàng)建完OAuth App后 我們可以在 Developer Settings 頁面看到我們新建的APP了,進(jìn)入查看詳情本讥,我們需要關(guān)注比較重要的3個參數(shù)苇倡。
名稱 | 備注 | Example |
---|---|---|
Client ID | OAuth App的賬戶 | 9f232c210ed1cada9a9b |
Client Secret | OAuth App的密碼 | 不告訴你 |
Authorization callback URL | 請求用戶授權(quán)成功后會重定向跳轉(zhuǎn)的地址 | http://localhost:8080/github.html |
正文
我們的需求是能夠在網(wǎng)頁上登錄的時候使用Github OAuth Login 所以我們就采用 Web Application flow 的方法。
根據(jù)文檔說明囤踩,Web應(yīng)用認(rèn)證流程分為以下幾步:
- 用戶被第三方客戶端(也就是我們的應(yīng)用)重定向至Github官網(wǎng)請求用戶授權(quán)旨椒。
- 用戶被Github帶上短暫有效的code重定向回第三方客戶端( 根據(jù)Authorization callback URL 指定的地址。
- 第三方客戶端 可以帶著通過code向Github換取的用戶token訪問Github API 得到用戶的資源堵漱。
1. 請求用戶授權(quán)
名稱 | 必填 | 備注 | Example |
---|---|---|---|
client_id | 是 | OAuth APP的Client ID;不記得的話往上翻 | 9f232c210ed1cada9a9b |
scope | 否 | 請求用戶授權(quán)的作用域;列表 | user,gist,repo, write:public_key |
redirect_uri | 否 | 授權(quán)后要跳轉(zhuǎn)的地址综慎;若是填了那么第二步請求也應(yīng)該填相同的值 | |
state | 否 | 用于防止攻擊的隨機(jī)碼;若是填了那么第二步請求也應(yīng)該填相同的值 | |
allow_signup | 否 | 用于是否允許用戶現(xiàn)在Github注冊再進(jìn)一步進(jìn)行授權(quán),默認(rèn)是true
|
根據(jù)文檔說明勤庐,我們要獲得用戶授權(quán)的方式就是將用戶重定向至Github的授權(quán)頁面示惊。
GET
- https://github.com/login/oauth/authorize
那么這里有幾個參數(shù)是至關(guān)重要的
名稱 | 必填 | 備注 | Example |
---|---|---|---|
client_id | 是 | OAuth APP的Client ID;不記得的話往上翻 | 9f232c210ed1cada9a9b |
scope | 否 | 請求用戶授權(quán)的作用域;列表 | user,gist,repo, write:public_key |
redirect_uri | 否 | 授權(quán)后要跳轉(zhuǎn)的地址;若是填了那么第二步請求也應(yīng)該填相同的值 | |
state | 否 | 用于防止攻擊的隨機(jī)碼愉镰;若是填了那么第二步請求也應(yīng)該填相同的值 | |
allow_signup | 否 | 用于是否允許用戶現(xiàn)在Github注冊再進(jìn)一步進(jìn)行授權(quán),默認(rèn)是true
|
恩米罚,那么說明有了,剩下就要舉個栗子:
https://github.com/login/oauth/authorize?client_id=9f232c210ed1cada9a9b&scopes=user,repo,admin:public_key
在進(jìn)行授權(quán)之后丈探,就會帶上code跳轉(zhuǎn)至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 | 否 | 授權(quán)后要跳轉(zhuǎn)的地址录择;若是填了那么第二步請求也應(yīng)該填相同的值 | |
state | 否 | 用于防止攻擊的隨機(jī)碼;若是填了那么第二步請求也應(yīng)該填相同的值 |
這里換取access_token的地址呢就是
post
- https://github.com/login/oauth/access_token
參數(shù)說明:
名稱 | 必填 | 備注 | Example |
---|---|---|---|
client_id | 是 | OAuth APP的Client ID;不記得的話往上翻 | 9f232c210ed1cada9a9b |
client_secret | 是 | OAuth APP的Client Secret;不記得的話往上翻 | 不告訴你 |
code | 是 | 第一步返回來的code | 21f82602133f1a4ee2c4 |
redirect_uri | 否 | 授權(quán)后要跳轉(zhuǎn)的地址碗降;若是填了那么第二步請求也應(yīng)該填相同的值 | |
state | 否 | 用于防止攻擊的隨機(jī)碼隘竭;若是填了那么第二步請求也應(yīng)該填相同的值 |
在這一步中 我們就要通過java調(diào)用restTemplate去Github服務(wù)器請求Github 用戶的access_token
// 代碼之后補(bǔ)上哦
3. 至此結(jié)束
得到access_token后我們就可以愉快的去訪問Github API啦,如果出現(xiàn)權(quán)限不夠的情況讼渊,那么就請回到第一步去根據(jù)需要調(diào)整scope
啦
順便介紹一下在在Github API請求中帶token的幾種方法
- Headers
在Http Headers中設(shè)置
Key | Value |
---|---|
Authorization | token ${access_token} |
- URL Params
在訪問的URL中帶上參數(shù)access_token=${access_token}
例如:
https://api.github.com/user?access_token=${access_token}
參考文獻(xiàn)
Github API - 官方文檔
Github OAuth App 用戶授權(quán)選項(xiàng)
理解OAuth 2.0 - 阮一峰