文章目录
前言
JSON Web Token (JWT)
是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON
对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
JWT
是由header
(头部)payload
(数据)signature
(签名)三部分组成,中间用点分隔开,并且都会使用 Base64
编码。
本文使用了密钥文件,可先生成相关秘钥数据(参考node加密集合(前端加密、后台解密))
一、安装依赖
npm install jsonwebtoken -S
and if use TS
npm install @types/jsonwebtoken -D
二、使用
1、默认同步签名(HMAC SHA256
<**>HS256
)对称秘钥
生成对称私钥
import { generateKeyPairSync } from 'crypto'
const { privateKey } = generateKeyPairSync('rsa', {
modulusLength: 1024, //
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret',
}
});
token加解密
const privateKey = 'admin-node-ts' // 自定义密码或者使用上述生成的对称私钥
// 加密
import jwt from 'jsonwebtoken';
var token = jwt.sign({ foo: 'bar' }, privateKey);
console.log('encoded', token)
// 解密
var decoded = jwt.verify(token, privateKey);
console.log('decoded', decoded)
2、同步签名(RSA SHA256
<**>RS256
)非对称秘钥(推荐)
secretOrPrivateKey has a minimum key size of 2048 bits for RS256
import { generateKeyPairSync } from 'crypto'
const { privateKey } = generateKeyPairSync('rsa', {
modulusLength: 2048,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
}
});
// 加密
import jwt from 'jsonwebtoken';
var token = jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256' });
console.log('encoded', token)
// 解密
var decoded = jwt.verify(token, privateKey, { algorithms: ['RS256'] });
console.log('decoded', decoded)
3、其他
时间有限~
算法 | 类型 |
---|---|
HS256 | HS256(使用SHA-256的HMAC)是一种对称密钥的散列算法 |
HS384 | - |
HS512 | - |
RS256 | RS256算法是一种非对称算法,使用私钥来签署JWT,使用公钥来验证该签名。 在签署你的JWT时,RS256是推荐的算法。 它更安全,而且如果钥匙被破坏,你可以快速地旋转钥匙。 (Auth0默认使用RS256来签署JWT) |
RS384 | - |
RS512 | - |
ES256 | - |
ES384 | - |
ES512 | - |
PS256 | - |
PS384 | - |
PS512 | - |
none | - |
三、设置时间
回溯时间
设置数据中添加iat
字段,用于设置回溯时间
import jwt from 'jsonwebtoken';
import { PRIVATE_KEY } from "./const/secret-key";
const iat= Math.floor(Date.now() / 1000) - 60; // 回溯前60s
var token = jwt.sign({ foo: 'bar', iat }, PRIVATE_KEY.toString(), { algorithm: 'RS256' });
过期时间
- 设置数据中添加
exp
字段,用于设置失效时间
import jwt from 'jsonwebtoken';
import { PRIVATE_KEY } from "./const/secret-key";
const exp = Math.floor(Date.now() / 1000) + 60; // 60s 失效
var token = jwt.sign({ foo: 'bar', exp }, PRIVATE_KEY.toString(), { algorithm: 'RS256' });
- expiresIn
import jwt from 'jsonwebtoken';
import { PRIVATE_KEY } from "./const/secret-key";
var token = jwt.sign({ foo: 'bar' }, PRIVATE_KEY.toString(), { algorithm: 'RS256', expiresIn: 60 * 60 }); // 推荐
or
var token = jwt.sign({ foo: 'bar' }, PRIVATE_KEY.toString(), { algorithm: 'RS256', expiresIn: '1h' }); // 优先推荐
一般有以下单位
s
=秒
m
=分
h
=时
d
=天
其他可使用ms进行转换使用