天天看點

JSON Web Token(JWT)學習筆記

1、JWT 的Token

标準的Token由三個部分并以.(點号)連接配接方式組成,即 header.payload.signature,如下

JSON Web Token(JWT)學習筆記

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

其中header,payload采用Base64編碼,

而signature則用 Base64 編碼後的 header.payload,再用一個 Secret 對這個串進行算法加密一下,Secret僅安全存儲在服務端

  • header 報頭

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

typ聲明類型,這裡是jwt

alg聲明加密的算法 通常直接使用 HMAC SHA256

  • payload 載荷

payload的标準字段

iss:Issuer,發行者(jwt簽發者)
sub:Subject,主題
aud:Audience,觀衆(接收jwt的一方)
exp:Expiration time,過期時間(jwt的過期時間,這個過期時間必須要大于簽發時間)
nbf:Not before(定義在什麼時間之前,該jwt都是不可用的)
iat:Issued at,發行時間(jwt的簽發時間)
jti:JWT ID(jwt的唯一身份辨別,主要用來作為一次性token,進而回避重播攻擊)      
  • signature 簽名

header (base64後的)

payload (base64後的)

secret

// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret');      

2、Token的使用

一般是在請求頭裡加入

Authorization

,并加上

Bearer

标注:

3、基于Token + 參數簽名的WebApi認證

JSON Web Token(JWT)學習筆記
  • 使用者使用使用者名密碼來請求伺服器
  • 伺服器進行驗證使用者的資訊
  • 伺服器通過驗證發送給使用者一個token
  • 用戶端存儲token,并在每次請求時附送上這個token值,一般都是将Token存放在Http請求的Headers
  • 服務端驗證token值,并傳回資料

參數簽名:使用者拿着相應的token以及請求的參數和伺服器端提供的簽名算法計算出簽名後再去通路指定的api

在請求頭中可添加timespan(時間戳),nonce(随機數),staffId(使用者Id),signature(簽名參數)

ajax用戶端調用樣例

$(function () {
    $.ajax({
        type: "get",
        url: url,
        data: {uid: 1},
        beforeSend: function (xhr) {
            xhr.setRequestHeader('Authorization', 'Bearer ' + token);
        },
        success: function (data, status) {
        },
        error: function (e) {
        },
        complete: function () {
        }
    });
});      

參考

https://github.com/jwt-dotnet/jwt

http://www.cnblogs.com/binyue/p/4812798.html

https://www.cnblogs.com/xiekeli/p/5607107.html

https://www.cnblogs.com/xiyin/p/6561652.html

http://blog.zhishile.com/Article/Show/5df2a392-8a8c-4e12-8a05-774f47a4570a

http://blog.zhishile.com/Article/Show/90e3cb1f-bbe5-4dbc-97f2-7ce7c8e83593

http://blog.zhishile.com/Article/Show/149167a2-8ca8-4d69-bdfc-83710807f252

http://www.cnblogs.com/MR-YY/p/5972380.html

http://www.cnblogs.com/lyzg/p/6028341.html

https://www.cnblogs.com/chenwolong/p/Token.html

https://www.cnblogs.com/lijingran/p/6420397.html

https://www.cnblogs.com/min-min-min/p/7682713.html