用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/microwind/ai-skills --skill jwt命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | JWT身份验证 |
| description | 当实现JWT身份验证时,设计令牌生成策略,优化身份验证流程,解决令牌安全问题。验证身份验证架构,设计授权机制,和最佳实践。 |
| license | MIT |
JWT(JSON Web Token)是现代Web应用中广泛使用的身份验证机制。不当的JWT实现会导致安全漏洞、令牌泄露和系统性能问题。在设计JWT系统前需要仔细分析安全需求。
核心原则: 好的JWT设计应该安全可靠、性能优良、易于管理、可扩展性强。坏的JWT设计会存在安全漏洞、令牌滥用、性能瓶颈。
始终:
触发短语:
问题: 令牌泄露风险
原因: 令牌在客户端存储不当
解决: 使用HttpOnly Cookie,避免localStorage存储敏感令牌
问题: 令牌被篡改
原因: 签名验证不严格
解决: 使用强签名算法,定期轮换密钥
问题: 令牌重放攻击
原因: 令牌唯一性不足
解决: 添加jti(JWT ID)声明,实现令牌黑名单
问题: 验证性能瓶颈
原因: 每次请求都验证令牌
解决: 实现令牌缓存,优化验证逻辑
问题: 令牌过大
原因: 载荷包含过多信息
解决: 精简载荷,使用引用ID
import jwt
import datetime
from typing import Dict, Optional
class JWTManager:
def __init__(self, secret_key: str, algorithm: str = 'HS256'):
self.secret_key = secret_key
self.algorithm = algorithm
def generate_token(self, payload: Dict, expires_in: int = 3600) -> str:
"""生成JWT令牌"""
now = datetime.datetime.utcnow()
payload.update({
'iat': now,
'exp': now + datetime.timedelta(seconds=expires_in),
'jti': str(uuid.uuid4()) # 唯一标识符
})
return jwt.encode(payload, self.secret_key, algorithm=self.algorithm)
def verify_token(self, token: str) -> Optional[Dict]:
"""验证JWT令牌"""
try:
payload = jwt.decode(
token,
self.secret_key,
algorithms=[self.algorithm]
)
return payload
except jwt.ExpiredSignatureError:
raise Exception()
jwt.InvalidTokenError:
Exception()
jwt_manager = JWTManager(secret_key=)
user_data = {: , : , : }
token = jwt_manager.generate_token(user_data, expires_in=)
:
payload = jwt_manager.verify_token(token)
()
Exception e:
()
class RefreshTokenManager:
def __init__(self, secret_key: str):
self.secret_key = secret_key
self.refresh_tokens = {} # 实际应用中应使用数据库
def generate_refresh_token(self, user_id: int) -> str:
"""生成刷新令牌"""
payload = {
'user_id': user_id,
'type': 'refresh',
'iat': datetime.datetime.utcnow(),
'exp': datetime.datetime.utcnow() + datetime.timedelta(days=7)
}
token = jwt.encode(payload, self.secret_key, algorithm='HS256')
self.refresh_tokens[user_id] = token
return token
def refresh_access_token(self, refresh_token: str) -> str:
"""使用刷新令牌获取新的访问令牌"""
try:
payload = jwt.decode(refresh_token, self.secret_key, algorithms=['HS256'])
if payload.get('type') != 'refresh':
raise Exception("无效的刷新令牌")
user_id = payload['user_id']
if self.refresh_tokens.get(user_id) != refresh_token:
raise Exception()
new_payload = {: user_id, : }
jwt_manager.generate_token(new_payload, expires_in=)
jwt.ExpiredSignatureError:
Exception()
jwt.InvalidTokenError:
Exception()
refresh_manager = RefreshTokenManager(secret_key=)
refresh_token = refresh_manager.generate_refresh_token(user_id=)
:
new_access_token = refresh_manager.refresh_access_token(refresh_token)
()
Exception e:
()
const jwt = require('jsonwebtoken');
class JWTAuthMiddleware {
constructor(secretKey) {
this.secretKey = secretKey;
}
// 生成令牌
generateToken(payload, expiresIn = '1h') {
return jwt.sign(payload, this.secretKey, { expiresIn });
}
// 验证中间件
authenticate() {
return (req, res, next) => {
const token = this.extractToken(req);
if (!token) {
return res.status(401).json({ error: '未提供令牌' });
}
try {
const decoded = jwt.verify(token, this.secretKey);
req.user = decoded;
next();
} catch (error) {
if (error.name === 'TokenExpiredError') {
return res.status(401).({ : });
} (error. === ) {
res.().({ : });
} {
res.().({ : });
}
}
};
}
() {
{
(!req.) {
res.().({ : });
}
(!roles.(req..)) {
res.().({ : });
}
();
};
}
() {
authHeader = req..;
(authHeader && authHeader.()) {
authHeader.();
}
;
}
}
auth = (process..);
app.(, auth.(), {
res.({ : req. });
});
app.(,
auth.(),
auth.([]),
{
res.({ : });
}
);