第五章:認(rèn)證(2)
第四章中,我們提到大多數(shù)網(wǎng)站使用用戶名和密碼作為身份驗(yàn)證的憑證。我們還討論到重復(fù)使用這些憑證訪問API是不安全的,所以API通常需要一個(gè)和用戶登錄網(wǎng)站時(shí)使用的不同的憑證集合招盲。常見的例子是密鑰。本章嘉冒,我們來看一下另一個(gè)解決方案曹货,開放授權(quán)(OAuth),這個(gè)是目前web上使用最廣泛的驗(yàn)證方案讳推。
讓生活更簡(jiǎn)單
是否有被逼完成下面這樣的注冊(cè)表單的經(jīng)歷顶籽?
在上面那樣的表單域中輸入一長(zhǎng)串的密鑰的用戶體驗(yàn)是非常糟糕的。首先银觅,你必須找到需要的密鑰礼饱。是的,當(dāng)你買了軟件之后究驴,它就會(huì)發(fā)送到你的收件箱里镊绪,但是一年之后呢,要找到它就很麻煩了(是從哪個(gè)郵箱發(fā)過來的洒忧?我是用哪個(gè)郵箱注冊(cè)的蝴韭?!)找到之后熙侍,你必須準(zhǔn)確無誤的輸入這個(gè)可惡的東西——打字錯(cuò)誤或遺漏某個(gè)字母就會(huì)得到一個(gè)錯(cuò)誤的結(jié)果榄鉴,甚至導(dǎo)致你還沒有注冊(cè)的軟件被鎖定!
強(qiáng)制用戶使用API密鑰的體驗(yàn)同樣糟糕蛉抓。輸入錯(cuò)誤的問題非常常見庆尘,并且它要求用戶手工完成客戶端和服務(wù)器之間的部分設(shè)置。用戶必須從服務(wù)器獲取密鑰巷送,然后給予客戶端驶忌。由于工具就意味著它應(yīng)該可以自動(dòng)工作,所以肯定還有更好的方案惩系。
開始OAuth位岔。OAuth解決的主要問題就是自動(dòng)完成密鑰的交換。它提供了一個(gè)標(biāo)準(zhǔn)的方法堡牡,用戶通過簡(jiǎn)單的幾個(gè)步驟就可以讓客戶端從服務(wù)器獲取一個(gè)密鑰抒抬。從用戶的角度來看,所有的OAuth都需要輸入憑證晤柄。而客戶端和服務(wù)器在幕后進(jìn)行工作擦剑,使客戶端獲取一個(gè)有效的密鑰。
目前OAuth有兩個(gè)版本,它們都有一個(gè)恰當(dāng)?shù)拿諳Auth 1和OAuth 2惠勒。要在和API通信的過程中使用它們進(jìn)行身份認(rèn)證赚抡,就有必要理解每個(gè)版本的步驟。因?yàn)樗鼈兪褂孟嗤墓ぷ髁骶牢荩覀儠?huì)討論OAuth 2的步驟涂臣,然后指出OAuth 的不同之處。
OAuth 2
我們首先需要了解OAuth交換過程中涉及的角色組件:
用戶 — 希望連接兩個(gè)網(wǎng)站的人
客戶端 — 被授權(quán)訪問用戶數(shù)據(jù)的網(wǎng)站
服務(wù)器 — 擁有用戶數(shù)據(jù)的網(wǎng)站
接下來售担,我們需要給出一個(gè)簡(jiǎn)單的免責(zé)聲明赁遗。OAuth 2的一個(gè)目標(biāo)是允許業(yè)務(wù)修改認(rèn)證過程適應(yīng)自己的需要。由于這種天生的可擴(kuò)展性族铆,API可以使用略有差異的步驟岩四。下面展示的是一個(gè)基于web的應(yīng)用的常見工作流。手機(jī)和桌面應(yīng)用的流程可能有輕微的差別哥攘。
這里就是OAuth 2的步驟剖煌。
-
用戶告訴客戶端去連接服務(wù)器
ch5-1.gif
用戶通過告訴客戶端他希望客戶端連接服務(wù)器來開始這個(gè)流程。通常是以點(diǎn)擊一個(gè)按鈕開始逝淹。
-
客戶端將用戶重定向到服務(wù)器
ch5-callback-url.gif
客戶端轉(zhuǎn)到服務(wù)器的網(wǎng)站耕姊,同時(shí)攜帶一個(gè)URL,服務(wù)器通過該URL轉(zhuǎn)回用戶認(rèn)證的網(wǎng)站创橄,這個(gè)URL叫做回調(diào)URL箩做。
-
用戶登錄到服務(wù)器莽红,授權(quán)客戶端訪問
ch5-2.gif
用戶使用他們的用戶名和密碼進(jìn)行服務(wù)器認(rèn)證妥畏。服務(wù)器現(xiàn)在可以確定它的一個(gè)用戶請(qǐng)求給予客戶端訪問這個(gè)用戶的賬戶和相關(guān)數(shù)據(jù)的權(quán)限。
-
服務(wù)器將用戶轉(zhuǎn)到客戶端安吁,同時(shí)攜帶認(rèn)證代碼
ch5-3.gif
服務(wù)器將用戶轉(zhuǎn)到客戶端(返回到步驟2的回調(diào)URL)醉蚁。在響應(yīng)中隱藏著給客戶端的一個(gè)唯一的認(rèn)證代碼。
ch5-code.gif -
客戶端使用認(rèn)證代碼+密鑰向服務(wù)器交換訪問令牌
客戶端使用它收到的認(rèn)證代碼創(chuàng)建另一個(gè)發(fā)送到服務(wù)器的請(qǐng)求鬼店。請(qǐng)求中包括客戶端的密鑰网棍。當(dāng)服務(wù)器看到一個(gè)有效的認(rèn)證代碼和一個(gè)受信任的客戶端密鑰,它確定客戶端就是它所宣稱的那個(gè)妇智,并且現(xiàn)在它代表一個(gè)真正的用戶滥玷。服務(wù)器在響應(yīng)中返回一個(gè)訪問令牌。
ch5-access-token.gif -
客戶端從服務(wù)器獲取數(shù)據(jù)
ch5-4.gif
到這個(gè)時(shí)候巍棱,客戶端可以代表用戶訪問服務(wù)器惑畴。步驟6中的訪問令牌本質(zhì)上就是服務(wù)器上用戶的另一個(gè)密碼『结悖客戶端在每一個(gè)請(qǐng)求中都包括訪問令牌如贷,所以它可以直接和服務(wù)器進(jìn)行認(rèn)證。
客戶端刷新令牌(可選)
OAuth 2引入的一個(gè)特性就是讓訪問令牌過期。這種安全性的增強(qiáng)有助于保護(hù)用戶的賬戶——令牌過期的時(shí)間越短杠袱,被盜的令牌可能被惡意使用的時(shí)間也就越短尚猿,類似于信用卡號(hào)碼過一段時(shí)間就過期。令牌的有效期是由服務(wù)器設(shè)置的楣富。API可以在幾個(gè)小時(shí)到幾個(gè)月的時(shí)間里自由使用所有資源凿掂。一旦有效期結(jié)束,客戶端必須向服務(wù)器申請(qǐng)新的令牌纹蝴。
OAuth 1 有什么不同
OAuth版本之間有幾個(gè)主要的區(qū)別缠劝。其中一個(gè)我們已經(jīng)提過了,訪問令牌不過期骗灶。
另一個(gè)區(qū)別是OAuth 1包括了一個(gè)額外的步驟惨恭。在上文的步驟1和2之間,OAuth 1需要客戶端向服務(wù)器申請(qǐng)一個(gè)請(qǐng)求令牌耙旦。這個(gè)令牌充當(dāng)了 OAuth 2 中認(rèn)證代碼的角色脱羡,用來交換訪問令牌。
第三個(gè)區(qū)別是OAuth 1需要數(shù)字簽名免都。我們會(huì)跳過簽名如何工作的細(xì)節(jié)(你可以找到做這個(gè)工作的代碼庫)锉罐,但是知道為什么一個(gè)版本有簽名而另一個(gè)版本沒有還是值得的。請(qǐng)求簽名可以保護(hù)數(shù)據(jù)在客戶端和服務(wù)器之間移動(dòng)時(shí)不會(huì)被篡改绕娘。簽名允許服務(wù)器核實(shí)請(qǐng)求的真實(shí)性脓规。
然而,現(xiàn)在大部分API傳輸都發(fā)生在一個(gè)安全的通道上(HTTPS)险领。認(rèn)識(shí)到這一點(diǎn)之后侨舆,OAuth 2取消了簽名從而使得版本二更容易使用。取而代之的是OAuth 2依賴于其他的方法來保證傳輸?shù)臄?shù)據(jù)的安全绢陌。
授權(quán)
OAuth 2中另一個(gè)需要特別注意的概念是限制訪問挨下,正式名稱叫做授權(quán)。返回到第2步脐湾,當(dāng)用戶點(diǎn)擊按鈕允許客戶端訪問的時(shí)候臭笆,隱藏在下面的是客戶端請(qǐng)求的具體權(quán)限。這些權(quán)限稱為范圍秤掌,是OAuth2的另一個(gè)重要特色愁铺。它們?yōu)榭蛻舳颂峁┝艘粋€(gè)方法,客戶端可以請(qǐng)求訪問用戶數(shù)據(jù)的受限權(quán)限闻鉴,這樣用戶更容易信任客戶端茵乱。
范圍的強(qiáng)大之處在于這種限制是基于客戶端的。API密鑰則不同椒拗,它的限制是基于密鑰的似将,導(dǎo)致所有客戶端都是相同的获黔,OAuth范圍允許一個(gè)客戶端擁有權(quán)限X,另一個(gè)客戶端有權(quán)限X和Y在验。這就是說一個(gè)網(wǎng)站可以查看你的通訊錄玷氏,而另一個(gè)網(wǎng)站可以查看也可以編輯。
譯自