Github認證調研

Github認證調研

背景介紹:項目上需要做鏡像服務中在線製作鏡像功能,第一步就是綁定代碼源,常見的公有云:阿里雲、華爲雲、百度雲、騰訊雲都有,都能綁定github賬號,也能獲取github的公有和私有倉庫。我調研的主要目標就是第三方應用如何獲得Github的授權。

我使用了阿里雲和百度雲的鏡像服務中的代碼庫綁定,綁定了github,所以在github的設置中的application中可以看到如下顯示:image-20200214124942338

百度雲使用了OAuth App

image-20200214125040603

阿里雲使用的權限

image-20200214125110457

我看阿里雲和百度雲都是使用了github的OAuth Apps,使用了OAuth2 協議。阮一峯老師講的auth2.0。將的很好,解了我很多的疑惑,尤其是更新令牌那塊,阮一峯的文章

第三方登錄原理

所謂第三方登錄,實質就是 OAuth 授權。用戶想要登錄 A 網站,A 網站讓用戶提供第三方網站的數據,證明自己的身份。獲取第三方網站的身份數據,就需要 OAuth 授權。舉例來說,A 網站允許 GitHub 登錄,背後就是下面的流程:

  1. A 網站讓用戶跳轉到 GitHub。
  2. GitHub 要求用戶登錄,然後詢問"A 網站要求獲得 xx 權限,你是否同意?"
  3. 用戶同意,GitHub 就會重定向回 A 網站,同時發回一個授權碼。
  4. A 網站使用授權碼,向 GitHub 請求令牌。
  5. GitHub 返回令牌.
  6. A 網站使用令牌,向 GitHub 請求用戶數據。

Github認證流程詳解

簡單看下github認證的時序圖,後面會一一講解,github官方文檔

image-01

登記

一個應用要求 OAuth 授權,必須先到對方網站登記,讓對方知道是誰在請求。所以,你要先去 GitHub 登記一下。登記網址應用的名稱隨便填,主頁 URL 填寫http://localhost:8080,跳轉網址填寫 http://localhost:8080/oauth/redirect。提交表單以後,GitHub 應該會返回客戶端 ID(client ID)和客戶端密鑰(client secret),這就是應用的身份識別碼:image-20200215114312131

請求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所示:

image-20200215114710785

返回 access_token

作爲迴應,GitHub 會返回一段 JSON 數據,裏面包含了令牌access_token,如下圖所示:

image-20200215114936312

用access_token正常請求

有了令牌以後,就可以向 API 請求數據了。比如請求user的數據,把token放在Header裏,格式

Authorization: token OAUTH-TOKEN

image-20200215115206265

返回結果:

{
    "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的頁面:

image-20200215115958024

拿到code後,再次去調https://github.com/login/oauth/access_token 接口,返回的值是這樣的:

access_token=cfee603fe634bb638bb21bb0dabeaa4d09232790&scope=repo&token_type=bearer

image-20200215132226487

上面這張圖片是獲取了用戶的所有倉庫。

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認證參考文章

github的api概覽

本文由博客一文多發平臺 OpenWrite 發佈!

發佈了159 篇原創文章 · 獲贊 141 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章