JWT
的定義及其組成
JWT(JSON Web Token)
是一個(gè)非常輕巧的規(guī)范垄惧。這個(gè)規(guī)范允許我們使用JWT在用戶和服務(wù)器之間傳遞安全可靠的信息。
一個(gè)JWT實(shí)際上就是一個(gè)字符串绰寞,它由三部分組成到逊,頭部、載荷與簽名滤钱。
載荷(Payload)
我們先將用戶認(rèn)證的操作描述成一個(gè)JSON對(duì)象觉壶。其中添加了一些其他的信息,幫助今后收到這個(gè)JWT的服務(wù)器理解這個(gè)JWT件缸。
{
"sub": "1",
"iss": "http://localhost:8000/auth/login",
"iat": 1451888119,
"exp": 1454516119,
"nbf": 1451888119,
"jti": "37c107e4609ddbcc9c096ea5ee76c667"
}
這里面的前6個(gè)字段都是由JWT的標(biāo)準(zhǔn)所定義的铜靶。
sub: 該JWT所面向的用戶
iss: 該JWT的簽發(fā)者
iat(issued at): 在什么時(shí)候簽發(fā)的token
exp(expires): token什么時(shí)候過(guò)期
nbf(not before):token在此時(shí)間之前不能被接收處理
jti:JWT ID為web token提供唯一標(biāo)識(shí)
這些定義都可以在標(biāo)準(zhǔn)中找到。
將上面的JSON對(duì)象進(jìn)行base64編碼可以得到下面的字符串:
eyJzdWIiOiIxIiwiaXNzIjoiaHR0cDpcL1wvbG9jYWx
ob3N0OjgwMDFcL2F1dGhcL2xvZ2luIiwiaWF0IjoxNDUxODg4MTE5LCJleHAiOjE0NTQ1MTYxMTksIm5iZiI6MTQ1MTg4OD
ExOSwianRpIjoiMzdjMTA3ZTQ2MDlkZGJjYzljMDk2ZWE1ZWU3NmM2NjcifQ
這個(gè)字符串我們將它稱作JWT的Payload(載荷)他炊。
如果你使用Node.js争剿,可以用Node.js的包base64url來(lái)得到這個(gè)字符串:
var base64url = require('base64url')
var header = {
"from_user": "B",
"target_user": "A"
}
console.log(base64url(JSON.stringify(header)))
注:Base64是一種編碼,也就是說(shuō)痊末,它是可以被翻譯回原來(lái)的樣子來(lái)的蚕苇。它并不是一種加密過(guò)程。
頭部(Header)
JWT還需要一個(gè)頭部凿叠,頭部用于描述關(guān)于該JWT的最基本的信息涩笤,例如其類型以及簽名所用的算法等。這也可以被表示成一個(gè)JSON對(duì)象:
{
"typ": "JWT",
"alg": "HS256"
}
在這里盒件,我們說(shuō)明了這是一個(gè)JWT蹬碧,并且我們所用的簽名算法(后面會(huì)提到)是HS256算法。
對(duì)它也要進(jìn)行Base64編碼炒刁,之后的字符串就成了JWT的Header(頭部):
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
簽名(簽名)
將上面的兩個(gè)編碼后的字符串都用句號(hào).連接在一起(頭部在前)恩沽,就形成了:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaXNzIjoiaHR0cDpcL1wvbG9jYWx
ob3N0OjgwMDFcL2F1dGhcL2xvZ2luIiwiaWF0IjoxNDUxODg4MTE5LCJleHAiOjE0NTQ1MTYxMTksIm5iZiI6MTQ1MTg4OD
ExOSwianRpIjoiMzdjMTA3ZTQ2MDlkZGJjYzljMDk2ZWE1ZWU3NmM2NjcifQ
最后,我們將上面拼接完的字符串用HS256算法進(jìn)行加密翔始。在加密的時(shí)候罗心,我們還需要提供一個(gè)密鑰(secret):
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
這樣就可以得到我們加密后的內(nèi)容:
wyoQ95RjAyQ2FF3aj8EvCSaUmeP0KUqcCJDENNfnaT4
這一部分又叫做簽名片吊。
最后將這一部分簽名也拼接在被簽名的字符串后面,我們就得到了完整的JWT:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaXNzIjoiaHR0cDpcL1wvbG9jYWx
ob3N0OjgwMDFcL2F1dGhcL2xvZ2luIiwiaWF0IjoxNDUxODg4MTE5LCJleHAiOjE0NTQ1MTYxMTksIm5iZiI6MTQ1MTg4OD
ExOSwianRpIjoiMzdjMTA3ZTQ2MDlkZGJjYzljMDk2ZWE1ZWU3NmM2NjcifQ.wyoQ95RjAyQ2FF3aj8EvCSaUmeP0KUqcCJDENNfnaT4