1、JWT 的Token
标準的Token由三個部分并以.(點号)連接配接方式組成,即 header.payload.signature,如下
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認證
- 使用者使用使用者名密碼來請求伺服器
- 伺服器進行驗證使用者的資訊
- 伺服器通過驗證發送給使用者一個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