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è)完成后智厌,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)上直接操作和使用他的部分資源。
服務(wù)端可以指定相應(yīng)的scope參數(shù)哲身,給用戶(hù)授權(quán)
登陸后辩涝,客戶(hù)可以拿到相應(yīng)的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.
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ù)的名字和郵箱等信息了。