jsonwebtoken
是一个用于生成和验证 JSON Web Tokens (JWT) 的库。以下是 jsonwebtoken
的使用方式及常用 API:
安装
首先,安装 jsonwebtoken
包:
npm install jsonwebtoken
生成 JWT
使用 jsonwebtoken
的 sign
方法生成 JWT。
const jwt = require('jsonwebtoken');
// 生成 JWT
function generateToken(payload, secretKey, expiresIn) {
return jwt.sign(payload, secretKey, { expiresIn });
}
// 示例
const token = generateToken({ userId: 1, username: 'user1' }, 'your_jwt_secret', '1h');
console.log(token);
验证 JWT
使用 jsonwebtoken
的 verify
方法验证 JWT。
const jwt = require('jsonwebtoken');
// 验证 JWT
function verifyToken(token, secretKey) {
try {
const decoded = jwt.verify(token, secretKey);
return decoded;
} catch (error) {
console.error('Invalid token:', error.message);
return null;
}
}
// 示例
const decoded = verifyToken(token, 'your_jwt_secret');
if (decoded) {
console.log('Token is valid:', decoded);
} else {
console.log('Invalid token');
}
常用 API
-
jwt.sign(payload, secretOrPrivateKey, [options])
- 用途:生成 JWT。
- 参数:
payload
:要编码的数据对象。secretOrPrivateKey
:用于签名的密钥或私钥。options
(可选):配置选项,如expiresIn
(过期时间)、algorithm
(签名算法)等。
- 返回值:生成的 JWT 字符串。
-
jwt.verify(token, secretOrPublicKey, [options, callback])
- 用途:验证 JWT。
- 参数:
token
:要验证的 JWT 字符串。secretOrPublicKey
:用于验证的密钥或公钥。options
(可选):配置选项,如algorithms
(允许的签名算法)等。callback
(可选):回调函数,用于处理验证结果。
- 返回值:解码后的 payload 对象,如果验证失败则抛出错误。
-
jwt.decode(token, [options])
- 用途:解码 JWT,但不验证签名。
- 参数:
token
:要解码的 JWT 字符串。options
(可选):配置选项,如complete
(返回完整的 token 对象)等。
- 返回值:解码后的 payload 对象,如果
complete
选项为true
,则返回完整的 token 对象。
示例代码
以下是一个完整的示例,展示了如何在用户登录时生成 JWT,并在后续请求中验证 JWT。
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());
const JWT_SECRET = 'your_jwt_secret';
// 生成 JWT
function generateToken(payload) {
return jwt.sign(payload, JWT_SECRET, { expiresIn: '1h' });
}
// 验证 JWT
function verifyToken(token) {
try {
const decoded = jwt.verify(token, JWT_SECRET);
return decoded;
} catch (error) {
console.error('Invalid token:', error.message);
return null;
}
}
// 登录路由
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 假设验证用户名和密码成功
const user = { id: 1, username };
const token = generateToken(user);
res.json({ token });
});
// 受保护的路由
app.get('/protected', (req, res) => {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) {
return res.status(401).json({ message: 'No token provided' });
}
const decoded = verifyToken(token);
if (!decoded) {
return res.status(401).json({ message: 'Invalid token' });
}
res.json({ message: 'This is a protected route', user: decoded });
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
总结
通过上述步骤和 API,你可以在应用中使用 jsonwebtoken
生成和验证 JWT,从而实现安全的用户认证和授权机制。