OAuth授權(quán)

OAuth概念

OAuth(開(kāi)放授權(quán))是一個(gè)開(kāi)放標(biāo)準(zhǔn)鹏氧,允許用戶(hù)讓第三方應(yīng)用訪問(wèn)該用戶(hù)在某一網(wǎng)站上存儲(chǔ)的私密的資源(如照片,視頻熙揍,聯(lián)系人列表)虎谢,而無(wú)需將用戶(hù)名和密碼提供給第三方應(yīng)用,下面以github 為例,簡(jiǎn)單講述OAuth2.0

應(yīng)用場(chǎng)景

假如你訪問(wèn)我的網(wǎng)站酬诀,看到上面有篇文章寫(xiě)的很爛脏嚷,你想去噴它一下,留言后發(fā)現(xiàn)需要登陸才能進(jìn)行評(píng)論瞒御,此時(shí)給你兩個(gè)選擇:1. 注冊(cè)并登陸后進(jìn)行評(píng)論 2. 使用github登陸授權(quán)后評(píng)論父叙。由于你實(shí)在不爽,迫不及待想噴它肴裙,注冊(cè)登陸太煩了趾唱,可能還有郵箱,手機(jī)等驗(yàn)證蜻懦。于是直接點(diǎn)擊了github授權(quán)甜癞,此時(shí)OAuth認(rèn)證流程就開(kāi)始了。需要注意的是宛乃,即便剛剛用戶(hù)才登陸過(guò)github悠咱,我的網(wǎng)站也不可能隨便發(fā)個(gè)請(qǐng)求給github,就能拿到用戶(hù)信息征炼。因此析既,我的網(wǎng)站需要和github需要一個(gè)協(xié)商。## 認(rèn)證流程

1.網(wǎng)站和github協(xié)商

github會(huì)對(duì)用戶(hù)的權(quán)限做分類(lèi)谆奥,讀取倉(cāng)庫(kù)信息的權(quán)限(CircleCi眼坏,Travis-Ci的集成測(cè)試)、寫(xiě)入倉(cāng)庫(kù)的權(quán)限酸些,用戶(hù)個(gè)人常用信息獲取等宰译。我如果我的這個(gè)應(yīng)用需要獲取用戶(hù)的follower等信息,我先得去github注冊(cè)一個(gè)應(yīng)用擂仍,在申請(qǐng)的時(shí)候需要選擇需要獲得的權(quán)限囤屹。首先注冊(cè)一個(gè)github的OAuth應(yīng)用熬甚,填寫(xiě)應(yīng)用名稱(chēng)逢渔,以及重定向地址(不能亂填)。


注冊(cè)應(yīng)用

授權(quán)id乡括,secret肃廓,以及callback_url

注冊(cè)完成后智厌,github給我發(fā)了一個(gè)client_id以及另外一個(gè)client_secret.

2.用戶(hù)和github協(xié)商

用戶(hù)進(jìn)入我的網(wǎng)站,點(diǎn)擊 github 登錄按鈕的時(shí)候盲赊,我的網(wǎng)站會(huì)把上面拿到的 client_id 交給用戶(hù)铣鹏,讓他進(jìn)入到 github 的授權(quán)頁(yè)面,github看到client_id哀蘑,就知道是從哪個(gè)應(yīng)用重定向過(guò)來(lái)的诚卸,于是它會(huì)把想要獲取的權(quán)限列出來(lái),讓用戶(hù)選擇是否允許授權(quán)這些權(quán)限绘迁。如果用戶(hù)拒絕合溺,整個(gè)認(rèn)證結(jié)束。如果用戶(hù)覺(jué)得可以缀台,選擇授權(quán)棠赛,頁(yè)面后跳轉(zhuǎn)到上面注冊(cè)的redirect_url,并且附帶一個(gè)一次性的code。這個(gè)時(shí)候膛腐,用戶(hù)和 github 之間的協(xié)商就已經(jīng)完成github 也會(huì)在自己的系統(tǒng)中記錄這次協(xié)商睛约,表示該用戶(hù)已經(jīng)允許在我的網(wǎng)站訪問(wèn)上直接操作和使用他的部分資源。


登陸認(rèn)證
授權(quán)對(duì)應(yīng)權(quán)限

服務(wù)端可以指定相應(yīng)的scope參數(shù)哲身,給用戶(hù)授權(quán)


授權(quán)scope為repo和user

登陸后辩涝,客戶(hù)可以拿到相應(yīng)的code

獲得code

但是由于沒(méi)有這個(gè)路由男韧,頁(yè)面會(huì)顯示404再姑,所以需要服務(wù)端重定向到首頁(yè)。拿到了code栅葡,接下來(lái)就可以去拿取access-token了误辑。### 3.應(yīng)用拿用戶(hù)的票據(jù)去github獲取相應(yīng)的數(shù)據(jù)

3.應(yīng)用拿用戶(hù)的票據(jù)去github獲取相應(yīng)的數(shù)據(jù)

在第2步的時(shí)候沧踏,已經(jīng)拿到了用戶(hù)的code,但是如果服務(wù)器直接拿code去github請(qǐng)求巾钉,肯定會(huì)遭到拒絕翘狱,因?yàn)槿魏稳硕贾纁ode,你還不能證明是你本人訪問(wèn)砰苍。接下來(lái)需要使用client_secret.拿著授權(quán)獲取的code潦匈,以及client_id以及client_secret去請(qǐng)求github,獲取access_token.


獲取token

4.用戶(hù)使用github賬戶(hù)赚导,在我的應(yīng)用上使用

上一步 github 已經(jīng)把最后的憑證 access_token 給我了茬缩,通過(guò) github 提供的 API 加access_token就能夠訪問(wèn)用戶(hù)的信息了,能獲取用戶(hù)的哪些權(quán)限在 response 中也給了明確的說(shuō)明吼旧,scope 為 user 和 gist凰锡,也就是只能獲取 user 組和 gist 組兩個(gè)小組的權(quán)限,user 組中就包含了用戶(hù)的名字和郵箱等信息了。


通過(guò)token獲取個(gè)人信息

關(guān)鍵參數(shù)

1. client_id 注冊(cè)時(shí)獲取掂为,用于獲取code和access_token
2. client_secret 注冊(cè)時(shí)獲取,用于獲取access_token
3. code 用戶(hù)登陸后裕膀,OAuth提供方返回的code,表示勇哗,用戶(hù)同意使用該OAuth認(rèn)證方式昼扛,登陸應(yīng)用。
4. redirect_url 注冊(cè)時(shí)填寫(xiě)的重定向路徑, 如果在服務(wù)端手動(dòng)改寫(xiě)和redirect_url不同的地址欲诺,則無(wú)法重定向成功, OAuth方會(huì)返回重定向錯(cuò)誤的提示.
5.scope 用于配置權(quán)限抄谐,一般有user, repo

code如何保證安全

1.code是一次性的,再次使用這個(gè)code去請(qǐng)求扰法,則失敗
再次使用code會(huì)失敗
2.使用的client_id斯稳,client_secret永久保存在服務(wù)器上的,只要服務(wù)器是安全的迹恐,即便有人中間試圖截取code挣惰,也是無(wú)效的,請(qǐng)求token需要發(fā)送client_id,client_secret以及code
3.redirect_url 如果重定向的地址和向OAuth提供商注冊(cè)的地址不同,則不會(huì)返回code殴边。如果地址注冊(cè)的是localhost憎茂,有可能竊取code,但是 也只有能訪問(wèn)該電腦的人能獲取權(quán)限锤岸。## 和OpenId的區(qū)別
OpenId 只用于身份認(rèn)證(Authentication)竖幔,允許你以同一個(gè)賬戶(hù)在多個(gè)網(wǎng)站登陸。它僅僅是為你的合法身份背書(shū)是偷,當(dāng)你以 Facebook 賬號(hào)登陸某個(gè)站點(diǎn)之后拳氢,該站點(diǎn)無(wú)權(quán)訪問(wèn)你的在 Facebook 上的數(shù)據(jù)。但是OAuth授權(quán)登陸后蛋铆,可能該網(wǎng)站就可以訪問(wèn)你的Facebook賬號(hào)的followers馋评,你關(guān)注的人之類(lèi)的數(shù)據(jù)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刺啦,一起剝皮案震驚了整個(gè)濱河市留特,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玛瘸,老刑警劉巖蜕青,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異糊渊,居然都是意外死亡右核,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)渺绒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贺喝,“玉大人磷瘤,你說(shuō)我怎么就攤上這事∷驯洌” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵针炉,是天一觀的道長(zhǎng)挠他。 經(jīng)常有香客問(wèn)我,道長(zhǎng)篡帕,這世上最難降的妖魔是什么殖侵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮镰烧,結(jié)果婚禮上拢军,老公的妹妹穿的比我還像新娘。我一直安慰自己怔鳖,他們只是感情好茉唉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著结执,像睡著了一般度陆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上献幔,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天懂傀,我揣著相機(jī)與錄音,去河邊找鬼蜡感。 笑死蹬蚁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郑兴。 我是一名探鬼主播犀斋,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼情连!你這毒婦竟也來(lái)了闪水?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蒙具,失蹤者是張志新(化名)和其女友劉穎球榆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體禁筏,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡持钉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篱昔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片每强。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡始腾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出空执,到底是詐尸還是另有隱情浪箭,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布辨绊,位于F島的核電站奶栖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏门坷。R本人自食惡果不足惜宣鄙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望默蚌。 院中可真熱鬧冻晤,春花似錦、人聲如沸绸吸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锦茁。三九已至温数,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜻势,已是汗流浹背撑刺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留握玛,地道東北人够傍。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挠铲,于是被迫代替她去往敵國(guó)和親冕屯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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