Github認證調研
背景介紹:項目上需要做鏡像服務中在線製作鏡像功能,第一步就是綁定代碼源,常見的公有云:阿里雲、華爲雲、百度雲、騰訊雲都有,都能綁定github賬號,也能獲取github的公有和私有倉庫。我調研的主要目標就是第三方應用如何獲得Github的授權。
我使用了阿里雲和百度雲的鏡像服務中的代碼庫綁定,綁定了github,所以在github的設置中的application中可以看到如下顯示:
百度雲使用了OAuth App
阿里雲使用的權限
我看阿里雲和百度雲都是使用了github的OAuth Apps,使用了OAuth2 協議。阮一峯老師講的auth2.0。將的很好,解了我很多的疑惑,尤其是更新令牌那塊,阮一峯的文章
第三方登錄原理
所謂第三方登錄,實質就是 OAuth 授權。用戶想要登錄 A 網站,A 網站讓用戶提供第三方網站的數據,證明自己的身份。獲取第三方網站的身份數據,就需要 OAuth 授權。舉例來說,A 網站允許 GitHub 登錄,背後就是下面的流程:
- A 網站讓用戶跳轉到 GitHub。
- GitHub 要求用戶登錄,然後詢問"A 網站要求獲得 xx 權限,你是否同意?"
- 用戶同意,GitHub 就會重定向回 A 網站,同時發回一個授權碼。
- A 網站使用授權碼,向 GitHub 請求令牌。
- GitHub 返回令牌.
- A 網站使用令牌,向 GitHub 請求用戶數據。
Github認證流程詳解
簡單看下github認證的時序圖,後面會一一講解,github官方文檔
登記
一個應用要求 OAuth 授權,必須先到對方網站登記,讓對方知道是誰在請求。所以,你要先去 GitHub 登記一下。登記網址應用的名稱隨便填,主頁 URL 填寫http://localhost:8080
,跳轉網址填寫 http://localhost:8080/oauth/redirect
。提交表單以後,GitHub 應該會返回客戶端 ID(client ID)和客戶端密鑰(client secret),這就是應用的身份識別碼:
請求github用戶授權
用戶授權就是請求如下地址,該地址在瀏覽器輸入,會自動跳轉到github認證頁面。
https://github.com/login/oauth/authorize?client_id=65210525ee9827b8d328&redirect_uri=http://localhost:8080/oauth/redirect&state=zhouyu
解釋下state可以用作當前用戶的標識,因爲有很多用戶在申請授權,根據回調的url中的state可以進行區分。此外上面的授權是普通授權,需要在參數中加入scope,在此不做演示。client_id
告訴 GitHub 誰在請求,redirect_uri
是稍後登陸完後跳轉回來的網址。用戶點擊到了 GitHub,GitHub 會要求用戶登錄,確保是本人在操作。
返回授權碼
登錄後,GitHub 詢問用戶,該應用正在請求數據,你是否同意授權。用戶同意授權, GitHub 就會跳轉到redirect_uri
指定的跳轉網址,並且帶上授權碼,跳轉回來的 URL 就是下面的樣子。
`markup
http://localhost:8080/oauth/redirect?
code=859310e7cecc9196f4af
`
後端收到這個請求以後,解析url就拿到了授權碼(code
參數)。
用授權碼獲取access_token
針對/oauth/redirect
的請求解析獲得授權碼code,用授權碼請求github獲取access_token,如下postman所示:
返回 access_token
作爲迴應,GitHub 會返回一段 JSON 數據,裏面包含了令牌access_token
,如下圖所示:
用access_token正常請求
有了令牌以後,就可以向 API 請求數據了。比如請求user的數據,把token放在Header裏,格式
Authorization: token OAUTH-TOKEN
返回結果:
{
"login": "fishingfly",
"id": 29742631,
"node_id": "MDQ6VXNlcjI5NzQyNjMx",
"avatar_url": "https://avatars2.githubusercontent.com/u/29742631?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/fishingfly",
"html_url": "https://github.com/fishingfly",
"followers_url": "https://api.github.com/users/fishingfly/followers",
"following_url": "https://api.github.com/users/fishingfly/following{/other_user}",
"gists_url": "https://api.github.com/users/fishingfly/gists{/gist_id}",
"starred_url": "https://api.github.com/users/fishingfly/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/fishingfly/subscriptions",
"organizations_url": "https://api.github.com/users/fishingfly/orgs",
"repos_url": "https://api.github.com/users/fishingfly/repos",
"events_url": "https://api.github.com/users/fishingfly/events{/privacy}",
"received_events_url": "https://api.github.com/users/fishingfly/received_events",
"type": "User",
"site_admin": false,
"name": null,
"company": null,
"blog": "",
"location": null,
"email": null,
"hireable": null,
"bio": null,
"public_repos": 22,
"public_gists": 0,
"followers": 1,
"following": 0,
"created_at": "2017-06-28T00:43:10Z",
"updated_at": "2020-02-15T03:26:52Z"
}
增加權限
要是需要展示倉庫信息的話,需要在請求github用戶授權(第二步)時加入scope。請求如下
https://github.com/login/oauth/authorize?client_id=65210525ee9827b8d328&redirect_uri=http://localhost:8080/oauth/redirect&state=zhouyu&scope=repo
scope除了寫repo之外,還能寫別的權限:參考這個連接
https://developer.github.com/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/下圖是增加repo權限後請求github的頁面:
拿到code後,再次去調https://github.com/login/oauth/access_token 接口,返回的值是這樣的:
access_token=cfee603fe634bb638bb21bb0dabeaa4d09232790&scope=repo&token_type=bearer
上面這張圖片是獲取了用戶的所有倉庫。
https://github.com/google/go-github 這個是github的V3api的go代碼庫,方便開發,裏面有認證相關的api。
https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/ 官方認證流程在這
今年可能廢棄的請求(token不要放url中就沒問題)
https://developer.github.com/changes/2020-02-10-deprecating-auth-through-query-param/ 廢棄驗證中Token放在請求url中的認證請求。這部分認證請求會在2020年5月廢除。之前的使用者將受到401狀態碼返回值。auth認證參考文章
本文由博客一文多發平臺 OpenWrite 發佈!