import jwt import datetime from functools import wraps from flask import request, jsonify from app.models.user import User from config import TOKEN_EXPIRATION_TIME as token_time from config import SECRET_KEY def generate_token(user): """ Gera um token JWT para o usuário """ expiration_time = datetime.datetime.utcnow() + datetime.timedelta(hours=token_time) token = jwt.encode( {"id": user.id, "email": user.email, "exp": expiration_time}, SECRET_KEY, algorithm="HS256" ) return token def decode_token(token): """ Decodifica um token JWT e retorna os dados do usuário """ try: decoded = jwt.decode(token, SECRET_KEY, algorithms=["HS256"]) return decoded except jwt.ExpiredSignatureError: return None except jwt.InvalidTokenError: return None def token_required(f): """ Decorator para proteger as rotas, exigindo um token válido. """ @wraps(f) def decorated_function(*args, **kwargs): token = None # Verifica se o token está no cabeçalho da requisição if "Authorization" in request.headers: token = request.headers["Authorization"].split(" ")[1] # Acessa apenas o token após "Bearer" if not token: return jsonify({"message": "Token é necessário!"}), 401 # Decodifica o token data = decode_token(token) if not data: return jsonify({"message": "Token inválido ou expirado!"}), 401 # Recupera o usuário do banco de dados user = User.query.get(data["id"]) if not user: return jsonify({"message": "Usuário não encontrado!"}), 404 # Passa o usuário para a função protegida return f(user, *args, **kwargs) return decorated_function