mentoria-api-flask/app/auth.py
2025-03-05 21:35:50 -04:00

64 lines
1.8 KiB
Python

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