定義
JSON Web Token(JWT)是壹個非常輕巧的規範。這個規範允許我們使用JWT在用戶和服務器之間傳遞安全可靠的信息。
適用場景
1、用於向Web應用傳遞壹些非敏感信息。例如完成加好友、下訂單的操作等等。
2、用於設計用戶認證和授權系統。
3、實現Web應用的單點登錄。
JWT的組成
壹個JWT實際上就是壹個字符串,它由三部分組成:頭部、載荷與簽名。
實例場景
在A用戶關註了B用戶的時候,系統發郵件給B用戶,並且附有壹個鏈接“點此關註A用戶”。鏈接的地址:/make-friend/?from_user=B&target_user=A。
讓B用戶不用登錄就可以完成這個操作。
載荷(Payload)
可以先將上面的添加好友的操作描述成壹個JSON對象。並添加壹些其他的信息,幫助收到這個JWT的服務器理解這個JWT。
{
"iss":?"John Wu JWT",
"iat":?1441593502,
"exp":?1441594722,
"aud":?"www.example.com",
"sub":?"jrocket@example.com",
"from_user":?"B",
"target_user":?"A"
}
前五個字段都是由JWT的標準所定義的。
iss: 該JWT的簽發者
sub: 該JWT所面向的用戶
aud: 接收該JWT的壹方
exp(expires): 什麽時候過期,這裏是壹個Unix時間戳
iat(issued at): 在什麽時候簽發的
將上面的JSON對象進行[base64編碼]可以得到下面的字符串。這個字符串我們將它稱作JWT的Payload(載荷)。
eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9
如果妳使用Node.js,可以用Node.js的包base64url來得到這個字符串。
var base64url =?require('base64url')
var header = {
"from_user":?"B",
"target_user":?"A"
}
console.log(base64url(JSON.stringify(header)))
// 輸出:eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9
小知識:Base64是壹種編碼,也就是說,它是可以被翻譯回原來的樣子來的。它並不是壹種加密過程。
頭部(Header)
頭部用於描述關於該JWT的最基本的信息,例如其類型以及簽名所用的算法等。這也可以被表示成壹個JSON對象。
{
"typ":?"JWT",
"alg":?"HS256"
}
在這裏,我們說明了這是壹個JWT,並且我們所用的簽名算法(後面會提到)是HS256算法。
對它也要進行Base64編碼,之後的字符串就成了JWT的Header(頭部)。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
簽名(簽名)
將上面的兩個編碼後的字符串都用點號連接在壹起(頭部在前),就形成了
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0
最後,我們將上面拼接完的字符串用HS256算法進行加密。在加密的時候,我們還需要提供壹個密鑰(secret)。如果我們用mystar作為密鑰的話,那麽就可以得到我們加密後的內容
rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM
這壹部分又叫做簽名。