安装
$ npm install jsonwebtoken
jwt分为签名和解密两个过程
签名过程
$ jwt.sign(payload, secretOrPrivateKey, options, callback)
payload(必填) :要编码到 token 中的数据,可以是对象、Buffer 或字符串。
secretOrPrivateKey(必填):用于签名的密钥
options(必填):配置选项对象
const options = {
// 算法配置
algorithm: 'HS256', // 默认: HS256
// 支持算法: HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, none
// 时间相关选项(会覆盖 payload 中的声明)
expiresIn: '2h', // 2小时过期
// 支持格式: 数字(秒)、字符串: 60, "2 days", "10h", "7d"
notBefore: '30s', // 30秒后生效
issuedAt: true, // 自动添加 iat,默认: true
// 其他选项
header: { // 自定义 header
typ: 'JWT',
kid: 'key-id-123'
},
audience: 'client-app', // 等同于 aud
issuer: 'my-auth-server', // 等同于 iss
subject: 'user-auth', // 等同于 sub
jwtid: 'unique-id-123', // 等同于 jti
noTimestamp: false, // 不添加 iat,默认: false
keyid: 'key-id-123', // 密钥ID(用于 JWK)
mutatePayload: false // 修改原始 payload 对象,默认: false
};
callback(可选):异步回调函数
同步方法
const jwt = require('jsonwebtoken');
const token = jwt.sign(
{
userId: '123',
username: 'john@example.com'
},
'your-secret-key',
{
algorithm: 'HS256',
expiresIn: '1h',
issuer: 'my-app'
}
);console.log('Token:', token);
异步方法
jwt.sign(
{ userId: '123' },
'your-secret-key',
{ expiresIn: '1h' },
(err, token) => {
if (err) throw err;
console.log('Async token:', token);
}
);
解密过程
$ jwt.verify(token, secretOrPublicKey, [options, callback])
token(必需):要验证的 JWT token 字符串。
一般存放在请求头authorization中
req.headers["authorization"]
secretOrPublicKey(必需):用于验证签名的密钥,类型取决于生成 token 时使用的算法。
options(可选):验证选项对象,包含各种验证配置。
const options = {
// 算法相关
algorithms: ['HS256'], // 允许的算法列表,默认: ['HS256']
complete: false, // 返回完整对象(包含header和payload),默认: false
// 时间验证
clockTimestamp: Math.floor(Date.now() / 1000), // 自定义当前时间(秒)
clockTolerance: 30, // 时钟容差(秒),默认: 0
maxAge: '2h', // token最大年龄(从签发时间算起)
ignoreExpiration: false, // 忽略过期时间,默认: false
ignoreNotBefore: false, // 忽略nbf声明,默认: false
// 声明验证
issuer: 'my-app', // 验证签发者(iss)
audience: 'client-app', // 验证受众(aud)
subject: 'user-auth', // 验证主题(sub)
jwtid: 'token-id-123', // 验证jti
// 其他选项
nonce: 'nonce-value', // 验证nonce(用于OpenID Connect)
allowInvalidAsymmetricKeyTypes: false // 允许无效的非对称密钥类型
};
callback(可选):回调函数
const decoded = jwt.verify(token, process.env.JWT_SECRET, {
algorithms: ['HS256'],
issuer: 'my-auth-server',
audience: 'web-client',
clockTolerance: 30, // 30秒时钟容差
maxAge: '2h' // token必须在2小时内使用
});
默认解码类型
{
userId: '123',
username: 'john@example.com',
iat: 1672531200,
exp: 1672534800
}
exp 用来判断token是否过期
946



被折叠的 条评论
为什么被折叠?



