"""Auth helpers: JWT issue/verify + admin guard.""" import functools from datetime import datetime, timedelta, timezone import jwt from flask import current_app, jsonify, request from models import User def issue_token(user): payload = { "user_id": user.id, "username": user.username, "exp": datetime.now(timezone.utc) + timedelta(hours=current_app.config["JWT_EXPIRE_HOURS"]), "iat": datetime.now(timezone.utc), } return jwt.encode(payload, current_app.config["SECRET_KEY"], algorithm="HS256") def decode_token(token): try: return jwt.decode(token, current_app.config["SECRET_KEY"], algorithms=["HS256"]) except jwt.PyJWTError: return None def get_current_user(): auth = request.headers.get("Authorization", "") if not auth.startswith("Bearer "): return None payload = decode_token(auth[7:]) if not payload: return None return User.query.get(payload["user_id"]) def admin_required(fn): @functools.wraps(fn) def wrapper(*args, **kwargs): user = get_current_user() if not user: return jsonify({"error": "未登录或登录已过期"}), 401 return fn(*args, **kwargs) return wrapper