cnpm install jsonwebtoken
基本使用
签名方法
jwt.sign(payload, secretOrPrivateKey, [options, callback])
payload 是一个json对象或者是一个可以json化的buffer或字符串 这里的信息都是可以使用jwt.verify()方法拿到的.
secretOrPrivateKey 是加密的key密匙.
const jwt = require('jsonwebtoken');
let token = jwt.sign({user: '1234'}, 'Fizz', {expiresIn: 60 * 60});
console.log(token);
解析验证方法
jwt.verify(token, secretOrPublicKey, [options, callback])
token: 就是token字符串 由jwt.sign()方法生成的
secretOrPublicKey:是加密的key,用于解析生成token时的payload参数
options: 设置一些解密的方法…
jwt.verify(token, 'Fizz', function (err, data) {if (err) console.log(err)console.log('解析的数据', data)})
一些方法
sign(payload,secret, {expiresIn:60*60*24})
// 授权时效24小时
//第三个参数是token的过期时间可以不设置
具体
JWT 标准的 Token 有三个部分:
header(头部)
payload(数据)
signature(签名)
中间用点分隔开,并且都会使用 Base64 编码
header 头部
里面包含加密类型以及签名所用的算法等。例如下面:
{
"alg": "HS256",
"typ": "JWT"
}
alg 属性表示签名的算法(algorithm),默认是HMAC SHA256(写成 HS256);
typ属性表示这个令牌(token)的类型(type),
JWT 令牌统一写为JWT。
最后,将上面的 JSON 对象使用 Base64URL 算法转成字符串。
Payload
Payload 部分是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段:
iss (issuer) :签发人
exp (expiration time) :过期时间
sub (subject) :主题
aud (audience):受众
nbf (Not Before) :生效时间
iat (Issued At) :签发时间
jti (JWT ID) :编号
exp (expiration time) :过期时间 会常用到。里面还能定义私有字段。而且默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。也使用 Base64URL 算法转成字符串。
Signature
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
HMACSHA256(
base64UrlEncode(header) + “.” +
base64UrlEncode(payload),
secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
const jwt = require("jsonwebtoken");
const secret = "aaabbbfadwesooweiiaf";
function createToken(payload){
payload.rtiem = new Date();
payload.exp = 60 * 60 * 2 *1000;
return jwt.sign(payload,secret);
}
function checkToken(token){
return new Promise((resolve,reject)=>{
jwt.verify(token,secret,(err,res)=>{
if(!err) {
resolve(res)
}else{
reject("token验证失败");
}
})
})
}
module.exports = {
createToken,checkToken
}
使用
//登录有效期和token的正确性验证
app.get('/list', function(req, res) {
checkToken(req.headers.Authorization).then(res=>{
//token验证成功
//判断过期时间
}).catch(err=>{
res.json({{err:-1,msg:'token非法'}})
})
});
if(){
let token = createToken({username:req.query.name});
res.json({err:0,msg:'OK',token});
}else{
res.json({err:-1,msg:'fail'});
}
jwt项目实践:
后面补充