我們?cè)谠O(shè)計(jì)一個(gè)網(wǎng)站或平臺(tái)的時(shí)候,經(jīng)常需要向用戶開(kāi)放 API 訪問(wèn)。這樣用戶就可以程序化地調(diào)用一些功能,舉幾個(gè)例子:
- 交易所開(kāi)放 API 讓用戶可以進(jìn)行低時(shí)延的程序化交易,
- 微信公眾號(hào)平臺(tái)開(kāi)放 API 讓三方工具進(jìn)行運(yùn)營(yíng)管理工作,
- Stripe 開(kāi)放 API 讓商家和其他平臺(tái)能很好地集成支付功能。
當(dāng)我們向用戶開(kāi)放 API 訪問(wèn)時(shí),我們需要確保每次 API 調(diào)用都經(jīng)過(guò)鑒權(quán)。這意味著我們需要確認(rèn)用戶是他們所聲稱(chēng)的身份。
我們一般使用兩種常見(jiàn)的方法來(lái)進(jìn)行鑒權(quán):
- 基于令牌的身份驗(yàn)證
- Hmac(基于哈希的消息驗(yàn)證碼)驗(yàn)證
下圖說(shuō)明了它們的工作原理。
01 基于令牌
第 1 步
用戶在客戶端輸入密碼,然后客戶端將密碼發(fā)送到鑒權(quán)服務(wù)器。
第 2 步
鑒權(quán)服務(wù)器驗(yàn)證密碼并生成一個(gè)有有效期的令牌。
第 3 步和第 4 步
現(xiàn)在,客戶端可以發(fā)送請(qǐng)求,使用 HTTP 頭中帶有的令牌訪問(wèn)服務(wù)器資源。這種訪問(wèn)在令牌過(guò)期前一直有效。
02 基于 HMAC
這種機(jī)制通過(guò)使用哈希函數(shù)(SHA256 或 MD5)生成消息驗(yàn)證碼(簽名)。
第 1 步和第 2 步
服務(wù)器生成兩個(gè)密鑰,一個(gè)是公共 App ID(公鑰),另一個(gè)是 API Key(私鑰)。
第 3 步
現(xiàn)在我們?cè)诳蛻舳松梢粋€(gè) HMAC 簽名(hmac A)。該簽名是根據(jù)圖中列出的一組字段生成的。注意這里會(huì)加入請(qǐng)求的時(shí)間戳,這樣一個(gè) HMAC 簽名是有有效期的,不會(huì)一直有效。
第 4 步
客戶端發(fā)送請(qǐng)求來(lái)訪問(wèn)服務(wù)器資源,HTTP 頭中包含 hmac A。
第 5 步
服務(wù)器收到包含請(qǐng)求數(shù)據(jù)和鑒權(quán)標(biāo)頭的請(qǐng)求。它從請(qǐng)求中提取必要的字段,并使用存儲(chǔ)在服務(wù)器端的 API Key 生成簽名(hmac B)。
第 6 步和第 7 步
服務(wù)器會(huì)比較 hmac A(在客戶端生成)和 hmac B(在服務(wù)器端生成)。如果兩者匹配,請(qǐng)求的資源將返回給客戶端。