接口認證方式:Bear Token

由於HTTP協議是開放的,能夠任人調用。因此,若是接口不但願被隨意調用,就須要作訪問權限的控制,認證是好的用戶,才容許調用API。html

Bearer Token(Token 令牌)web

定義:爲了驗證使用者的身份,須要客戶端向服務器端提供一個可靠的驗證信息,稱爲Token,這個token一般由Json數據格式組成,經過hash散列算法生成一個字符串,因此稱爲Json Web Token(Json表示令牌的原始值是一個Json格式的數據,web表示是在互聯網傳播的,token表示令牌,簡稱JWT)算法

Bearer驗證也屬於HTTP協議標準驗證,它隨着OAuth協議而開始流行。Bearer驗證中的憑證稱爲BEARER_TOKEN,或者是access_token,它的頒發和驗證徹底由咱們本身的應用程序來控制,而不依賴於系統和Web服務器,Bearer驗證的標準請求方式以下:json

Authorization:Bearer [BEARER_TOKEN]

Bearer認證,其核心即是BEARER_TOKEN,而最流行的Token編碼方式即是:JSON WEB TOKEN(JWT)。Json Web Token (JWT), 是爲了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標準。該token被設計爲緊湊且安全的,特別適用於分佈式站點的單點登陸(SSO)場景。JWT的聲明通常被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也能夠增長一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。api

jwt主要包含如下三個內容:跨域

  1. 頭部 Header
  2. 載荷 Payload
  3. 簽名 Signature

頭部(Header)安全

{
  "alg": "HS256",
  "typ": "JWT"
}

alg是所使用的hash算法,如:SHA25六、HMAC SHA256或RSA,HMAC(Hash Message Authentication Code,散列消息鑑別碼);typ是Token的類型,在這裏就是:JWT。服務器

而後使用Base64Url編碼成第一部分網絡

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.<second part>.<third part>

載荷(Payload)app

這一部分是JWT主要的信息存儲部分,其中包含了許多種的聲明(Claims)。

Claims的實體通常包含用戶和一些元數據,這些Claims分紅三種類型:

  1. reserved claims:預約義的一些聲明,並非強制的可是推薦,它們包括 iss (issuer), exp (expiration time),sub (subject),aud(audience) 等(這裏都使用三個字母的緣由是保證 JWT 的緊湊)。
  2. public claims: 公有聲明,這個部分能夠隨便定義,可是要注意和 IANA JSON Web Token 衝突。
  3. 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請求的數據主體中。

使用JWT的好處
  1. 通用:由於json的通用性,因此JWT是能夠進行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等不少語言均可以使用。
  2. 緊湊:JWT的構成很是簡單,字節佔用很小,能夠經過 GET、POST 等放在 HTTP 的 header 中,很是便於傳輸。
  3. 擴展:JWT是自我包涵的,包含了必要的全部信息,不須要在服務端保存會話信息, 很是易於應用的擴展。
相關文章
相關標籤/搜索