简介
Node.js 的 JSON Web Token 模块有很多,我选择使用 jsonwebtoken。
项目地址: https://www.npmjs.com/package/jsonwebtoken
安装
npm install jsonwebtoken --save
用法
const jwt = require("jsonwebtoken") const secret = "some word"; let payload = {}; payload.data = data || {}; //token 中包含的数据 payload.ctime = (new Date()).getTime(); //token的创建时间 payload.expiresIn = 1000*60*60*24*7; //设定的过期时间 let token = jwt.sign(payload,secret);
函数
创建 JsonWebToken
jwt.sign(payload, secretOrPrivateKey, [options, callback])
(异步)如果提供回调,则使用err或JWT 调用回调。
(同步)将JsonWebToken返回为字符串。
payload必须是一个object, buffer或者string。请注意,exp只有当payload是object字面量时才可以设置。
secretOrPrivateKey 是包含HMAC算法的密钥或RSA和ECDSA的PEM编码私钥的string或buffer。
options:
algorithm:加密算法(默认值:HS256) expiresIn:以秒表示或描述时间跨度zeit / ms的字符串。如60,"2 days","10h","7d",Expiration time,过期时间 notBefore:以秒表示或描述时间跨度zeit / ms的字符串。如:60,"2days","10h","7d" audience:Audience,观众 issuer:Issuer,发行者 jwtid:JWT ID subject:Subject,主题 noTimestamp header
如果payload不是buffer或string,它将被强制转换为使用的字符串JSON.stringify()。
在expiresIn,notBefore,audience,subject,issuer没有默认值时。也可以直接在payload中用exp,nbf,aud,sub和iss分别表示,但是你不能在这两个地方同时设置。
请记住exp,nbf,iat是NumericDate类型。
生成的jwts通常会包含一个iat值除非指定了noTimestamp。如果iat插入payload中,则将使用它来代替实际的时间戳来计算其他事情,诸如options.expiresIn给定一个exp这样的时间间隔。
// sign with default (HMAC SHA256) var jwt = require('jsonwebtoken'); var token = jwt.sign({ foo: 'bar' }, 'shhhhh'); //backdate a jwt 30 seconds var older_token = jwt.sign({ foo: 'bar', iat: Math.floor(Date.now() / 1000) - 30 }, 'shhhhh'); // sign with RSA SHA256 var cert = fs.readFileSync('private.key'); // get private key var token = jwt.sign({ foo: 'bar' }, cert, { algorithm: 'RS256'});
Token Expiration (exp claim) 过期时间
// 签署1小时期限的token: jwt.sign({ exp: Math.floor(Date.now() / 1000) + (60 * 60), data: 'foobar' }, 'secret'); 使用此库生成令牌的另一种方法是: jwt.sign({ data: 'foobar' }, 'secret', { expiresIn: 60 * 60 }); //or even better: jwt.sign({ data: 'foobar' }, 'secret', { expiresIn: '1h' });
验证 JSON Web Token 的合法性
jwt.verify(token,secretOrPublicKey,[options,callback])
可以检验 JWT 的合法性,并获取 payload 中的内容。
// verify a token symmetric - synchronous var decoded = jwt.verify(token, 'shhhhh'); console.log(decoded.foo) // bar // verify a token symmetric jwt.verify(token, 'shhhhh', function(err, decoded) { console.log(decoded.foo) // bar }); // invalid token - synchronous try { var decoded = jwt.verify(token, 'wrong-secret'); } catch(err) { // err } // invalid token jwt.verify(token, 'wrong-secret', function(err, decoded) { // err // decoded undefined }); // verify a token asymmetric var cert = fs.readFileSync('public.pem'); // get public key jwt.verify(token, cert, function(err, decoded) { console.log(decoded.foo) // bar });
参考:
https://github.com/auth0/node-jsonwebtoken#readme
https://segmentfault.com/a/1190000009494020
https://javascript.net.cn/article?id=570