第四章:認(rèn)證(1)
隨著對API的理解,我們已經(jīng)學(xué)到了一些東西。我們知道什么是客戶端和服務(wù)器,知道它們使用HTTP進(jìn)行交談,知道它們使用特定的數(shù)據(jù)格式交談以理解彼此的話。雖然我們知道它們?nèi)绾谓徽?,但是還有一個(gè)非常重要的問題:服務(wù)器如何知道客戶端就是它所宣稱的那個(gè)呢?本章,我們?yōu)g覽客戶端向服務(wù)器證明自己身份的兩種方式。
虛擬世界的身份
以前你可能已經(jīng)在網(wǎng)站上注冊過帳號。在這個(gè)過程中,網(wǎng)站會(huì)詢問你一些私人信息,尤其是用戶名和密碼。這兩部分信息成為你的身份標(biāo)志。我們稱之為憑證。當(dāng)你再次訪問這個(gè)網(wǎng)站的時(shí)候,你可以通過提供這些憑證來登錄。
使用用戶名和密碼來登錄是身份認(rèn)證這一技術(shù)過程的例子。當(dāng)你和服務(wù)器進(jìn)行認(rèn)證的時(shí)候,你通過向服務(wù)器提供只有你自己知道(起碼我們希望只有你知道)的信息來證明自己的身份。一旦服務(wù)器知道你是誰,它會(huì)信任你,并且向你暴露賬戶的隱私數(shù)據(jù)。
API使用多種方式對客戶端進(jìn)行認(rèn)證。這些方式稱為認(rèn)證方案?,F(xiàn)在我們來看兩種方案。
基礎(chǔ)認(rèn)證
上面的登錄的例子就是最基礎(chǔ)的認(rèn)證方式。實(shí)際上,它的正式名稱就是基礎(chǔ)認(rèn)證。雖然這個(gè)名字毫無新意,但是這個(gè)方案在API對客戶端進(jìn)行認(rèn)證的時(shí)候是完全可以接受的。
基礎(chǔ)認(rèn)證只要求提供用戶名和密碼??蛻舳耸褂眠@兩個(gè)憑證,組合成一個(gè)值,放置在HTTP的Authorization首部中和請求一起發(fā)送到服務(wù)器。

服務(wù)器收到請求后,查看Authorization首部,和自己存儲的憑證進(jìn)行比較。如果用戶名和密碼可以和服務(wù)器上的用戶列表中的某一個(gè)匹配,服務(wù)器把它當(dāng)成那個(gè)用戶,完成請求。如果沒有匹配的用戶,服務(wù)器返回一個(gè)特定的狀態(tài)碼(401),告訴客戶端認(rèn)證失敗,請求被拒絕。
雖然基礎(chǔ)認(rèn)證是一個(gè)有效的認(rèn)證方案,但是它使用相同的用戶名、密碼來使用API和管理賬戶,這不是理想的方案。這相當(dāng)于一個(gè)旅館給了客人一把整棟建筑的鑰匙而不是某個(gè)房間的鑰匙。
和API類似,有些時(shí)候客戶端的許可應(yīng)該和賬戶所有者不同。比如,一個(gè)企業(yè)主雇傭了一個(gè)承包商,讓他寫一個(gè)使用收益API的程序。如果所有者輕易相信承包商的憑證就會(huì)有風(fēng)險(xiǎn),因?yàn)椴坏赖碌某邪炭赡軙?huì)修改密碼,使得企業(yè)主不能使用自己的賬戶。很顯然,如果能有一個(gè)替代方案就好了。
API密鑰認(rèn)證
API密鑰認(rèn)證技術(shù)可以克服共享憑證的缺陷,它要求使用唯一的密鑰來訪問API。本方案中,密鑰通常是一長串的字母和數(shù)字,和賬戶所有者的登錄密碼是不同的。所有者將密鑰給予客戶端,類似于旅館將一個(gè)房間的鑰匙給予客人。
當(dāng)客戶端使用API密鑰認(rèn)證時(shí),服務(wù)器知道應(yīng)該允許客戶端訪問數(shù)據(jù),但是現(xiàn)在可以有選擇的限制管理功能,比如修改密碼或者刪除賬戶。有時(shí)候,密鑰使用起來如此簡單,用戶都不需要給出密碼。API密鑰認(rèn)證的靈活性就是,既可以限制控制權(quán)限,又可以保護(hù)用戶的密碼。
那么,API密鑰在哪兒呢?也有一個(gè)專門的首部,是嗎?很不幸,沒有。和基礎(chǔ)認(rèn)證不同,API密鑰認(rèn)證不是一個(gè)由嚴(yán)格的規(guī)則構(gòu)建的標(biāo)準(zhǔn),它來自于web早期幾個(gè)公司的構(gòu)想。結(jié)果就是,API認(rèn)證有點(diǎn)類似蠻荒的西部,不同的人有不同的實(shí)現(xiàn)方式。
隨著時(shí)間的流逝,出現(xiàn)了一些常見的方案。其中之一是讓客戶端將密鑰放在Authorization首部中,取代用戶名和密碼的位置。另一個(gè)是將密鑰加到URL中(http://example.com?api_key=my_secret_key )。不太常見的方法是將密鑰放到請求主體中緊挨著數(shù)據(jù)。不管放在哪里,效果是一樣的——它允許服務(wù)器對客戶端進(jìn)行認(rèn)證。
譯自