簡(jiǎn)述 OAuth 2.0 的運(yùn)作流程

本文將以用戶使用 github 登錄網(wǎng)站留言為例,簡(jiǎn)述 OAuth 2.0 的運(yùn)作流程。

假如我有一個(gè)網(wǎng)站罢杉,你是我網(wǎng)站上的訪客粪小,看了文章想留言表示「朕已閱」大磺,留言時(shí)發(fā)現(xiàn)有這個(gè)網(wǎng)站的帳號(hào)才能夠留言,此時(shí)給了你兩個(gè)選擇:一個(gè)是在我的網(wǎng)站上注冊(cè)擁有一個(gè)新賬戶探膊,然后用注冊(cè)的用戶名來留言杠愧;一個(gè)是使用 github 帳號(hào)登錄,使用你的 github 用戶名來留言逞壁。前者你覺得過于繁瑣流济,于是慣性地點(diǎn)擊了 github 登錄按鈕,此時(shí) OAuth 認(rèn)證流程就開始了腌闯。

需要明確的是绳瘟,即使用戶剛登錄過 github,我的網(wǎng)站也不可能向 github 發(fā)一個(gè)什么請(qǐng)求便能夠拿到訪客信息姿骏,這顯然是不安全的糖声。就算用戶允許你獲取他在 github 上的信息,github 為了保障用戶信息安全分瘦,也不會(huì)讓你隨意獲取蘸泻。所以操作之前,我的網(wǎng)站與 github 之間需要要有一個(gè)協(xié)商擅腰。

  1. 網(wǎng)站和 Github 之間的協(xié)商

Github 會(huì)對(duì)用戶的權(quán)限做分類蟋恬,比如讀取倉庫信息的權(quán)限、寫入倉庫的權(quán)限趁冈、讀取用戶信息的權(quán)限歼争、修改用戶信息的權(quán)限等等拜马。如果我想獲取用戶的信息,Github 會(huì)要求我沐绒,先在它的平臺(tái)上注冊(cè)一個(gè)應(yīng)用俩莽,在申請(qǐng)的時(shí)候標(biāo)明需要獲取用戶信息的哪些權(quán)限,用多少就申請(qǐng)多少乔遮,并且在申請(qǐng)的時(shí)候填寫你的網(wǎng)站域名扮超,Github 只允許在這個(gè)域名中獲取用戶信息。

此時(shí)我的網(wǎng)站已經(jīng)和 Github 之間達(dá)成了共識(shí)蹋肮,Github 也給我發(fā)了兩張門票出刷,一張門票叫做 Client Id,另一張門票叫做 Client Secret坯辩。

  1. 用戶和 Github 之間的協(xié)商

用戶進(jìn)入我的網(wǎng)站馁龟,點(diǎn)擊 github 登錄按鈕的時(shí)候,我的網(wǎng)站會(huì)把上面拿到的 Client Id 交給用戶漆魔,讓他進(jìn)入到 Github 的授權(quán)頁面坷檩,Github 看到了用戶手中的門票,就知道這是我的網(wǎng)站讓他過來的改抡,于是它就把我的網(wǎng)站想要獲取的權(quán)限擺出來矢炼,并詢問用戶是否允許我獲取這些權(quán)限。

// 用戶登錄 github阿纤,協(xié)商
GET https://github.com/login/oauth/authorize

// 協(xié)商憑證
params = {
client_id: "xxxx",
redirect_uri: "http://my-website.com"
}
如果用戶覺得我的網(wǎng)站要的權(quán)限太多句灌,或者壓根就不想我知道他這些信息,選擇了拒絕的話欠拾,整個(gè) OAuth 2.0 的認(rèn)證就結(jié)束了涯塔,認(rèn)證也以失敗告終。如果用戶覺得 OK清蚀,在授權(quán)頁面點(diǎn)擊了確認(rèn)授權(quán)后,頁面會(huì)跳轉(zhuǎn)到我預(yù)先設(shè)定的 redirect_uri 并附帶一個(gè)蓋了章的門票 code爹谭。

// 協(xié)商成功后帶著蓋了章的 code
Location: http://my-website.com?code=xxx
這個(gè)時(shí)候枷邪,用戶和 Github 之間的協(xié)商就已經(jīng)完成,Github 也會(huì)在自己的系統(tǒng)中記錄這次協(xié)商诺凡,表示該用戶已經(jīng)允許在我的網(wǎng)站訪問上直接操作和使用他的部分資源东揣。

  1. 告訴 Github 我的網(wǎng)站要來拜訪了

第二步中,我們已經(jīng)拿到了蓋過章的門票 code腹泌,但這個(gè) code 只能表明嘶卧,用戶允許我的網(wǎng)站從 github 上獲取該用戶的數(shù)據(jù),如果我直接拿這個(gè) code 去 github 訪問數(shù)據(jù)一定會(huì)被拒絕凉袱,因?yàn)槿魏稳硕伎梢猿钟?code芥吟,github 并不知道 code 持有方就是我本人侦铜。

還記得之前申請(qǐng)應(yīng)用的時(shí)候 github 給我的兩張門票么,Client Id 在上一步中已經(jīng)用過了钟鸵,接下來輪到另一張門票 Client Secret钉稍。

// 網(wǎng)站和 github 之間的協(xié)商
POST https://github.com/login/oauth/access_token

// 協(xié)商憑證包括 github 給用戶蓋的章和 github 發(fā)給我的門票
params = {
code: "xxx",
client_id: "xxx",
client_secret: "xxx",
redirect_uri: "http://my-website.com"
}
拿著用戶蓋過章的 code 和能夠標(biāo)識(shí)個(gè)人身份的 client_id、client_secret 去拜訪 github棺耍,拿到最后的綠卡 access_token贡未。

// 拿到最后的綠卡
response = {
access_token: "e72e16c7e42f292c6912e7710c838347ae178b4a"
scope: "user,gist"
token_type: "bearer",
refresh_token: "xxxx"
}

  1. 用戶開始使用 github 帳號(hào)在我的頁面上留言

// 訪問用戶數(shù)據(jù)
GET https://api.github.com/user?access_token=e72e16c7e42f292c6912e7710c838347ae178b4a
上一步 github 已經(jīng)把最后的綠卡 access_token 給我了,通過 github 提供的 API 加綠卡就能夠訪問用戶的信息了蒙袍,能獲取用戶的哪些權(quán)限在 response 中也給了明確的說明俊卤,scope 為 user 和 gist,也就是只能獲取 user 組和 gist 組兩個(gè)小組的權(quán)限害幅,user 組中就包含了用戶的名字和郵箱等信息了消恍。

// 告訴我用戶的名字和郵箱
response = {
username: "barretlee",
email: "barret.china@gmail.com"
}
整個(gè) OAuth2 流程在這里也基本完成了,文章中的表述很粗糙矫限,比如 access_token 這個(gè)綠卡是有過期時(shí)間的哺哼,如果過期了需要使用 refresh_token 重新簽證。重點(diǎn)是讓讀者理解整個(gè)流程叼风,細(xì)節(jié)部分可以閱讀 RFC6749 文檔取董。

希望對(duì)你理解 OAuth 2.0 有幫助。(本文完)

本文鏈接:http://www.barretlee.com/blog/2016/01/10/oauth2-introduce/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末无宿,一起剝皮案震驚了整個(gè)濱河市茵汰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孽鸡,老刑警劉巖蹂午,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異彬碱,居然都是意外死亡豆胸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門巷疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晚胡,“玉大人,你說我怎么就攤上這事嚼沿」琅蹋” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵骡尽,是天一觀的道長(zhǎng)遣妥。 經(jīng)常有香客問我,道長(zhǎng)攀细,這世上最難降的妖魔是什么箫踩? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任爱态,我火速辦了婚禮,結(jié)果婚禮上班套,老公的妹妹穿的比我還像新娘肢藐。我一直安慰自己,他們只是感情好吱韭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布吆豹。 她就那樣靜靜地躺著,像睡著了一般理盆。 火紅的嫁衣襯著肌膚如雪痘煤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天猿规,我揣著相機(jī)與錄音衷快,去河邊找鬼。 笑死姨俩,一個(gè)胖子當(dāng)著我的面吹牛蘸拔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播环葵,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼调窍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了张遭?” 一聲冷哼從身側(cè)響起邓萨,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菊卷,沒想到半個(gè)月后缔恳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洁闰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年歉甚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扑眉。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铃芦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出襟雷,到底是詐尸還是另有隱情,我是刑警寧澤仁烹,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布耸弄,位于F島的核電站,受9級(jí)特大地震影響卓缰,放射性物質(zhì)發(fā)生泄漏计呈。R本人自食惡果不足惜砰诵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捌显。 院中可真熱鬧茁彭,春花似錦、人聲如沸扶歪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽善镰。三九已至妹萨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炫欺,已是汗流浹背乎完。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留品洛,地道東北人树姨。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像桥状,于是被迫代替她去往敵國和親帽揪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 參考知乎 OAuth 授權(quán)的工作原理是怎樣的岛宦?足夠安全嗎台丛?阮一峰 理解OAuth 2.0 一、第三方應(yīng)用如何授權(quán)才...
    合肥黑閱讀 8,062評(píng)論 0 5
  • 以下是官網(wǎng)直譯:https://oauth.net/ 1. 首頁 OAuth是一種開放協(xié)議(注:協(xié)議是公開的砾肺,任何...
    KennethChen93閱讀 11,208評(píng)論 0 20
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理挽霉,服務(wù)發(fā)現(xiàn),斷路器变汪,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • 作者:unvs發(fā)布時(shí)間: 2013-09-27 11:47 轉(zhuǎn)載自:http://kb.cnblogs.com/p...
    安東的漫長(zhǎng)歲月閱讀 2,553評(píng)論 2 25
  • 周一學(xué)《活法》隨時(shí)準(zhǔn)備說謝謝侠坎,作為人隨時(shí)隨地說謝謝。謝謝這個(gè)詞對(duì)陌生人說的非常多裙盾,對(duì)家人.朋友.同事說的比較少实胸,謝...
    武廳887685閱讀 273評(píng)論 0 0