因為HTTP協議是開放的,可以任人調用。所以,如果接口不希望被隨意調用,就需要做訪問權限的控制,認證是好的用戶,才允許調用API。
Bearer Token(Token 令牌)
定義:為了驗證使用者的身份,需要客戶端向服務器端提供一個可靠的驗證信息,稱為Token,這個token通常由Json數據格式組成,通過hash散列算法生成一個字符串,所以稱為Json Web Token(Json表示令牌的原始值是一個Json格式的數據,web表示是在互聯網傳播的,token表示令牌,簡稱JWT)
Bearer驗證也屬於HTTP協議標准驗證,它隨着OAuth協議而開始流行。Bearer驗證中的憑證稱為BEARER_TOKEN,或者是access_token,它的頒發和驗證完全由我們自己的應用程序來控制,而不依賴於系統和Web服務器,Bearer驗證的標准請求方式如下:
Authorization:Bearer [BEARER_TOKEN]
Bearer認證,其核心便是BEARER_TOKEN,而最流行的Token編碼方式便是:JSON WEB TOKEN(JWT)。Json Web Token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標准。該token被設計為緊湊且安全的,特別適用於分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。
jwt主要包含以下三個內容:
- 頭部 Header
- 載荷 Payload
- 簽名 Signature
頭部(Header)
{ "alg": "HS256", "typ": "JWT" }
alg是所使用的hash算法,如:SHA256、HMAC SHA256或RSA,HMAC(Hash Message Authentication Code,散列消息鑒別碼);typ是Token的類型,在這里就是:JWT。
然后使用Base64Url編碼成第一部分
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.<second part>.<third part>
載荷(Payload)
這一部分是JWT主要的信息存儲部分,其中包含了許多種的聲明(Claims)。
Claims的實體一般包含用戶和一些元數據,這些Claims分成三種類型:
- reserved claims:預定義的一些聲明,並不是強制的但是推薦,它們包括 iss (issuer), exp (expiration time),sub (subject),aud(audience) 等(這里都使用三個字母的原因是保證 JWT 的緊湊)。
- public claims: 公有聲明,這個部分可以隨便定義,但是要注意和 IANA JSON Web Token 沖突。
- private claims: 私有聲明,這個部分是共享被認定信息中自定義部分。
一個簡單的Payload可以是這樣子的:
{ "user_name": "admin", "scope": [ "read","write","del" ], "organization": "admin", "exp": 1531975621, "authorities": [ "ADMIN" ], "jti": "23408d38-8cdc-4460-beac-24c76dc7629a", "client_id": "webapp" }
這部分同樣使用Base64Url編碼成第二部分
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.<third part>
簽名(Signature)
Signature是用來驗證發送者的JWT的同時也能確保在期間不被篡改。
簽名哈希部分是對上面兩部分數據簽名,通過指定的算法生成哈希,以確保數據不會被篡改。
首先,需要指定一個密碼(secret)。該密碼僅僅為保存在服務器中,並且不能向用戶公開。然后,使用標頭中指定的簽名算法(默認情況下為HMAC SHA256)根據以下公式生成簽名。
使用Base64編碼后的header和payload以及一個秘鑰,使用header中指定簽名算法進行簽名。
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
結果:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-19
1.令牌的好處:避免在使用中不斷的輸入賬號和密碼,比較安全
2.如果要測試帶token的接口,首先要進行登錄,登錄成功會有個token信息,向api接口發送請求的時候必須帶上這個token,故需要做2次請求(1,登錄,拿到token 2,正式對接口進行測試)
3.注意點:
1)token一般有時間限制。測試前需要跟開發確認token可以用多久,什么時候算token失效
2)token放在哪兒,怎么傳回去,需要有開發文檔,或者咨詢開發,登錄成功返回的token需要了解從什么地方獲取(可以通過錄制進行查看)
JWT的工作過程
客戶端接收服務器返回的JWT,將其存儲在Cookie或localStorage中。
此后,客戶端將在與服務器交互中都會帶JWT。如果將它存儲在Cookie中,就可以自動發送,但是不會跨域,因此一般是將它放入HTTP請求的Header Authorization字段中。
Authorization: Bearer JWT_TOKEN
當跨域時,也可以將JWT被放置於POST請求的數據主體中。
- 通用:因為json的通用性,所以JWT是可以進行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用。
- 緊湊:JWT的構成非常簡單,字節占用很小,可以通過 GET、POST 等放在 HTTP 的 header 中,非常便於傳輸。
- 擴展:JWT是自我包涵的,包含了必要的所有信息,不需要在服務端保存會話信息, 非常易於應用的擴展。