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