古詩詞大全網 - 藝術簽名 - json web tokens 怎麽用

json web tokens 怎麽用

定義

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

這壹部分又叫做簽名。