本文目录导读:

我来详细介绍JWT(JSON Web Token)的生成和验证方法,包括Node.js的实现示例。
JWT 基本概念
JWT由三部分组成:
- Header:包含token类型和加密算法
- Payload:包含用户数据和声明
- Signature:对前两部分的签名
Node.js 实现(使用 jsonwebtoken 库)
安装依赖
npm install jsonwebtoken
JWT 生成(签名)
const jwt = require('jsonwebtoken');
// 密钥(生产环境应使用环境变量)
const SECRET_KEY = 'your-secret-key-here';
// 生成 JWT Token
function generateToken(user) {
// payload 数据
const payload = {
userId: user.id,
username: user.username,
role: user.role
};
// 配置选项
const options = {
expiresIn: '24h', // 过期时间
issuer: 'your-app', // 签发者
subject: user.id // 主题(用户ID)
};
// 生成 token
const token = jwt.sign(payload, SECRET_KEY, options);
return token;
}
// 使用示例
const user = {
id: '12345',
username: 'john_doe',
role: 'admin'
};
const token = generateToken(user);
console.log('Generated Token:', token);
JWT 验证
// 验证 Token
function verifyToken(token) {
try {
// 验证并解码
const decoded = jwt.verify(token, SECRET_KEY, {
issuer: 'your-app' // 验证签发者
});
return {
valid: true,
decoded
};
} catch (error) {
return {
valid: false,
error: error.message
};
}
}
// 使用示例
const result = verifyToken(token);
if (result.valid) {
console.log('Token is valid:', result.decoded);
} else {
console.log('Token is invalid:', result.error);
}
完整的 Express 中间件示例
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const SECRET_KEY = 'your-secret-key-here';
// 登录接口 - 生成 Token
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 验证用户(实际应用中需要查询数据库)
if (username === 'admin' && password === '123456') {
const user = {
id: '123',
username: 'admin',
role: 'admin'
};
const token = jwt.sign(user, SECRET_KEY, {
expiresIn: '24h'
});
res.json({
success: true,
token
});
} else {
res.status(401).json({
success: false,
message: 'Invalid credentials'
});
}
});
// JWT 验证中间件
const authMiddleware = (req, res, next) => {
const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return res.status(401).json({
success: false,
message: 'No token provided'
});
}
const token = authHeader.split(' ')[1];
try {
const decoded = jwt.verify(token, SECRET_KEY);
req.user = decoded;
next();
} catch (error) {
return res.status(401).json({
success: false,
message: 'Invalid or expired token'
});
}
};
// 受保护的路由
app.get('/protected', authMiddleware, (req, res) => {
res.json({
success: true,
message: 'You have access to this protected route',
user: req.user
});
});
Python 实现(使用 PyJWT)
import jwt
from datetime import datetime, timedelta
# 密钥
SECRET_KEY = 'your-secret-key-here'
# 生成 Token
def generate_token(user_id, username, role):
payload = {
'user_id': user_id,
'username': username,
'role': role,
'exp': datetime.utcnow() + timedelta(hours=24), # 过期时间
'iat': datetime.utcnow() # 签发时间
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
return token
# 验证 Token
def verify_token(token):
try:
decoded = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
return {
'valid': True,
'payload': decoded
}
except jwt.ExpiredSignatureError:
return {'valid': False, 'error': 'Token expired'}
except jwt.InvalidTokenError:
return {'valid': False, 'error': 'Invalid token'}
# 使用示例
token = generate_token(123, 'john_doe', 'admin')
result = verify_token(token)
最佳实践
密钥管理
// 使用环境变量存储密钥
require('dotenv').config();
const SECRET_KEY = process.env.JWT_SECRET_KEY;
Token 刷新机制
// 生成 access token(短期)和 refresh token(长期)
function generateTokens(user) {
const accessToken = jwt.sign(
{ userId: user.id },
SECRET_KEY,
{ expiresIn: '15m' } // access token 15分钟
);
const refreshToken = jwt.sign(
{ userId: user.id, type: 'refresh' },
REFRESH_SECRET_KEY,
{ expiresIn: '7d' } // refresh token 7天
);
return { accessToken, refreshToken };
}
// 刷新 access token
function refreshAccessToken(refreshToken) {
try {
const decoded = jwt.verify(refreshToken, REFRESH_SECRET_KEY);
if (decoded.type !== 'refresh') {
throw new Error('Invalid refresh token');
}
const newAccessToken = jwt.sign(
{ userId: decoded.userId },
SECRET_KEY,
{ expiresIn: '15m' }
);
return { accessToken: newAccessToken };
} catch (error) {
throw new Error('Invalid or expired refresh token');
}
}
安全建议
- 使用 HTTPS 传输 Token
- 设置合理的过期时间
- 不要在 Payload 中存储敏感信息
- 定期轮换密钥
- 实现 Token 黑名单机制(用于登出)
这就是 JWT 的生成和验证的基本实现,根据你的具体需求,可以调整 payload 内容和配置选项。