JWT生成和验证怎么写?

wen python案例 3

本文目录导读:

JWT生成和验证怎么写?

  1. JWT 基本概念
  2. Node.js 实现(使用 jsonwebtoken 库)
  3. 完整的 Express 中间件示例
  4. Python 实现(使用 PyJWT)
  5. 最佳实践

我来详细介绍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');
  }
}

安全建议

  1. 使用 HTTPS 传输 Token
  2. 设置合理的过期时间
  3. 不要在 Payload 中存储敏感信息
  4. 定期轮换密钥
  5. 实现 Token 黑名单机制(用于登出)

这就是 JWT 的生成和验证的基本实现,根据你的具体需求,可以调整 payload 内容和配置选项。

抱歉,评论功能暂时关闭!