本文目录导读:

我来详细介绍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 内容和配置选项。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播