參考: 【翻譯】在Nodejs中使用JSON WEB Tokens
JWT原理
一個(gè)JWT被周期(period)分寸了三個(gè)部分矗漾。JWT是URL-safe的药薯,意味著可以用來(lái)查詢字符參數(shù)。
- 第一部分
JWT的第一部分是一個(gè)js對(duì)象狂丝,表面JWT的加密方法换淆。實(shí)例使用了HMAC SHA-266
{
"typ" : "JWT",
"alg" : "HS256"
}
在加密之后,這個(gè)對(duì)象變成了一個(gè)字符串:
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
- 第二部分
JWT的第二部分是token的核心几颜,他也是一個(gè)JS兌現(xiàn)倍试,包含了一些信息。有一些是必須的蛋哭,有一些是選擇性的县习。一個(gè)實(shí)例如下:
{
"iss": "joe",
"exp": 1300819380,
"http://example.com/is_root": true
}
這被稱為JWT Claims Set。因?yàn)檫@篇文章的目的,我們將忽視第三個(gè)參數(shù)躁愿。但是你可以閱讀這篇文章.這個(gè)iss
是issuer
的簡(jiǎn)寫(xiě)叛本,表明請(qǐng)求的實(shí)體。通常意味著請(qǐng)求API的用戶彤钟。exp
是expires
的簡(jiǎn)寫(xiě)来候,是用來(lái)限制token的生命周期。一旦加密逸雹,JSON token就像這樣:
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
- 第三部分
第三個(gè)也是最后一個(gè)部分吠勘,是JWT根據(jù)第一部分和第二部分的簽名(Signature)。像這個(gè)樣子:
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
使用
用戶登錄成功后, 服務(wù)端發(fā)送一個(gè)token給客戶端
const db = require('../mysql');
const express = require('express');
const app = express();
const jwt = require('jwt-simple');
const moment = require('moment')
//...業(yè)務(wù)代碼省略
if(登錄成功){
let expires = moment().add(1,'days').valueOf(); //設(shè)置過(guò)期時(shí)間
let token = jwt.encode({
iss: u_id,
exp: expires
}, app.get('jwtTokenSecret'));
//這里我把token存到數(shù)據(jù)庫(kù)了,看實(shí)際情況而定
saveToken(rows[0].u_id,token)
return res.json({
userId: rows[0].u_id,
token: token,
state: true,
info: "登錄成功",
})
}