使用 GitHub OAuth 第三方驗證登錄 原 薦

現在很多站點都支持第三方登錄功能。
作爲一個技術博客,目標受衆項是一批程序員,第三方登錄的就選中了github。
這篇文章注意是講一講如何給自己的博客添加github自動登錄功能。

OAuth 2.0

說到第三方登錄,不得不提的一個知識點就是 oauth 2.0。

OAuth(開放授權)是一個開放標準,允許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯繫人列表),而無需將用戶名和密碼提供給第三方應用。 ---- 百度百科

這個協議在認證和授權的時候涉及到:

  1. 服務提供方,例如 GitHub,GitHub上儲存了用戶的登錄名,Email,暱稱,頭像等信息
  2. 用戶
  3. 客戶端,例如我的博客就是一個客戶端,需要服務方向我提供用戶的一些基本信息

OAuth 協議的認證和授權的過程如下:

  1. 用戶打開我的博客後,我想要通過GitHub獲取改用戶的基本信息
  2. 在轉跳到GitHub的授權頁面後,用戶同意我獲取他的基本信息
  3. 博客獲得GitHub提供的授權碼,使用該授權碼向GitHub申請一個令牌
  4. GitHub對博客提供的授權碼進行驗證,驗證無誤後,發放一個令牌給博客端
  5. 博客端使用令牌,向GitHub獲取用戶信息
  6. GitHub 確認令牌無誤,返回給我基本的用戶信息

如何使用GitHub提供的 OAuth 服務

  1. 打開 Setting > Developer setting > OAuth applications
  2. 點擊 Register a new application
  3. 填入基本的app信息
  4. 創建成功,會有如下頁面

alt

這裏的各項配置具體的作用,我們還是看一看GitHub提供的文檔 OAuth GitHub Developer Guide

具體流程

  1. 轉跳到 GitHub 用戶授權頁面, client_id 必須傳
    其他參數如果有需要就傳,例如我這裏需要獲取用戶的郵箱信息,就加了一個 scope=user:email
    最終拼成的URL如下:
    https://github.com/login/oauth/authorize?client_id=myclient_id&scope=user:email

  2. 當用戶同意授權後,鏈接地址就會轉跳到 我們配置頁面內的 Authorization callback URL 所填寫的URL地址,並且會帶上一個 code參數,這個參數在後面獲取用戶token是必須的一個參數。
    獲取到這個code參數後,我會將這個code傳到服務器的後臺,然後後臺調用 https://github.com/login/oauth/access_token 這個api,傳入 client_id client_secret code 這三個參數,可以獲取到一個 access_token。

  3. 獲取到 access_token 後, 再調用 https://api.github.com/user?access_token=access_token 這個API,就可以獲取到基本的用戶信息了。 用戶的基本信息內容如下所示, 根據第一步傳入的不同的 scope,獲取到的用戶信息也是不同的。博客後臺使用 login 字段作爲用戶的唯一標示,因爲email 可能爲空,之前用email發生了一些bug。

{
    "login": "Diamondtest",
    "id": 28478049,
    "avatar_url": "https://avatars0.githubusercontent.com/u/28478049?v=3",
    "gravatar_id": "",
    "url": "https://api.github.com/users/Diamondtest",
    "html_url": "https://github.com/Diamondtest",
    "followers_url": "https://api.github.com/users/Diamondtest/followers",
    "following_url": "https://api.github.com/users/Diamondtest/following{/other_user}",
    "gists_url": "https://api.github.com/users/Diamondtest/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/Diamondtest/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/Diamondtest/subscriptions",
    "organizations_url": "https://api.github.com/users/Diamondtest/orgs",
    "repos_url": "https://api.github.com/users/Diamondtest/repos",
    "events_url": "https://api.github.com/users/Diamondtest/events{/privacy}",
    "received_events_url": "https://api.github.com/users/Diamondtest/received_events",
    "type": "User",
    "site_admin": false,
    "name": null,
    "company": null,
    "blog": "",
    "location": null,
    "email": null,
    "hireable": null,
    "bio": null,
    "public_repos": 0,
    "public_gists": 0,
    "followers": 0,
    "following": 0,
    "created_at": "2017-05-06T08:08:09Z",
    "updated_at": "2017-05-06T08:16:22Z"
}

這樣,從獲取授權,到獲得用戶信息的流程就走完了。 再根據自己的需求進行用戶信息儲存,自有登錄的接入,用戶資料的管理。就完成了一套第三方登錄的方案。

目前市面上主流的協議就是 OAuth2.0。 例如 QQ,微信,微博等等。 所以只要搞明白大概流程,那麼接入其他供應商的第三方登錄也是小菜一碟了。

希望這篇文章對大家有所幫助,有什麼意見和想法,也可以在本文底部留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章