blob: 24704d11f4edc0adf1c1daaaa4f775e88647b5b8 [file] [log] [blame]
TRM-codingd1cbf672025-06-18 15:15:08 +08001# utils/auth.py
2import os
3import jwt
4from functools import wraps
5from flask import request, jsonify, current_app
6from models.user import User
7from app import db
8
9def generate_token(user_id):
10 payload = {
11 'user_id': user_id,
12 # you can add exp, iat here
13 }
14 token = jwt.encode(payload, current_app.config['SECRET_KEY'], algorithm='HS256')
15 return token
16
17def verify_token(token):
18 try:
19 payload = jwt.decode(token, current_app.config['SECRET_KEY'], algorithms=['HS256'])
20 user = User.query.get(payload['user_id'])
21 return user
22 except Exception:
23 return None
24
25def login_required(f):
26 @wraps(f)
27 def decorated(*args, **kwargs):
28 auth_header = request.headers.get('Authorization', None)
29 if not auth_header or not auth_header.startswith('Bearer '):
30 return jsonify({'error': 'Authorization header missing or invalid'}), 401
31 token = auth_header.split()[1]
32 user = verify_token(token)
33 if not user or user.status != 'active':
34 return jsonify({'error': 'Invalid or expired token'}), 401
35 # attach user to request context if needed
36 request.current_user = user
37 return f(*args, **kwargs)
38 return decorated