forked from Anteros-Code-Mentoria/poc-mvc-ocr
64 lines
1.8 KiB
Python
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
|
|
|