現(xiàn)在很多站點(diǎn)都支持第三方登錄功能士飒。
作為一個(gè)技術(shù)博客,目標(biāo)受眾項(xiàng)是一批程序員,第三方登錄的就選中了github并级。
這篇文章注意是講一講如何給自己的博客添加github自動(dòng)登錄功能。
OAuth 2.0
說到第三方登錄侮腹,不得不提的一個(gè)知識(shí)點(diǎn)就是 oauth 2.0嘲碧。
OAuth(開放授權(quán))是一個(gè)開放標(biāo)準(zhǔn),允許用戶讓第三方應(yīng)用訪問該用戶在某一網(wǎng)站上存儲(chǔ)的私密的資源(如照片凯旋,視頻呀潭,聯(lián)系人列表)钉迷,而無(wú)需將用戶名和密碼提供給第三方應(yīng)用至非。 ---- 百度百科
這個(gè)協(xié)議在認(rèn)證和授權(quán)的時(shí)候涉及到:
- 服務(wù)提供方,例如 GitHub糠聪,GitHub上儲(chǔ)存了用戶的登錄名荒椭,Email,昵稱舰蟆,頭像等信息
- 用戶
- 客戶端趣惠,例如我的博客就是一個(gè)客戶端,需要服務(wù)方向我提供用戶的一些基本信息
OAuth 協(xié)議的認(rèn)證和授權(quán)的過程如下:
- 用戶打開我的博客后身害,我想要通過GitHub獲取改用戶的基本信息
- 在轉(zhuǎn)跳到GitHub的授權(quán)頁(yè)面后味悄,用戶同意我獲取他的基本信息
- 博客獲得GitHub提供的授權(quán)碼,使用該授權(quán)碼向GitHub申請(qǐng)一個(gè)令牌
- GitHub對(duì)博客提供的授權(quán)碼進(jìn)行驗(yàn)證塌鸯,驗(yàn)證無(wú)誤后侍瑟,發(fā)放一個(gè)令牌給博客端
- 博客端使用令牌,向GitHub獲取用戶信息
- GitHub 確認(rèn)令牌無(wú)誤丙猬,返回給我基本的用戶信息
如何使用GitHub提供的 OAuth 服務(wù)
- 打開 Setting > Developer setting > OAuth applications
- 點(diǎn)擊 Register a new application
- 填入基本的app信息
- 創(chuàng)建成功涨颜,會(huì)有如下頁(yè)面
這里的各項(xiàng)配置具體的作用,我們還是看一看GitHub提供的文檔 OAuth GitHub Developer Guide
具體流程
- 轉(zhuǎn)跳到 GitHub 用戶授權(quán)頁(yè)面茧球,
client_id
必須傳
其他參數(shù)如果有需要就傳庭瑰,例如我這里需要獲取用戶的郵箱信息,就加了一個(gè)scope=user:email
最終拼成的URL如下:
https://github.com/login/oauth/authorize?client_id=myclient_id&scope=user:email
當(dāng)用戶同意授權(quán)后抢埋,鏈接地址就會(huì)轉(zhuǎn)跳到 我們配置頁(yè)面內(nèi)的 Authorization callback URL 所填寫的URL地址弹灭,并且會(huì)帶上一個(gè) code參數(shù),這個(gè)參數(shù)在后面獲取用戶token是必須的一個(gè)參數(shù)揪垄。
獲取到這個(gè)code參數(shù)后穷吮,我會(huì)將這個(gè)code傳到服務(wù)器的后臺(tái),然后后臺(tái)調(diào)用https://github.com/login/oauth/access_token
這個(gè)api福侈,傳入client_id
,client_secret
,code
這三個(gè)參數(shù)酒来,可以獲取到一個(gè)access_token
。獲取到 access_token 后肪凛, 再調(diào)用
https://api.github.com/user?access_token=access_token
這個(gè)API堰汉,就可以獲取到基本的用戶信息了辽社。 用戶的基本信息內(nèi)容如下所示, 根據(jù)第一步傳入的不同的 scope翘鸭,獲取到的用戶信息也是不同的滴铅。博客后臺(tái)使用login
字段作為用戶的唯一標(biāo)示,因?yàn)閑mail 可能為空就乓,之前用email發(fā)生了一些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"
}
這樣,從獲取授權(quán)生蚁,到獲得用戶信息的流程就走完了噩翠。 再根據(jù)自己的需求進(jìn)行用戶信息儲(chǔ)存,自有登錄的接入邦投,用戶資料的管理伤锚。就完成了一套第三方登錄的方案。
目前市面上主流的協(xié)議就是 OAuth2.0志衣。 例如 QQ屯援,微信,微博等等念脯。 所以只要搞明白大概流程狞洋,那么接入其他供應(yīng)商的第三方登錄也是小菜一碟了。