sip_huellas/api/app/routes/auth.py

69 lines
2.3 KiB
Python

from flask import Blueprint, request, jsonify
from app.database import db
# ⬇️ Cambiamos esta línea para importar desde el módulo raíz de modelos ⬇️
from app.models import User, Role
from app.middlewares.auth_middleware import token_required
import jwt
import datetime
import os
# (El resto del código del archivo auth.py queda exactamente igual)
auth_bp = Blueprint('auth', __name__)
@auth_bp.route('/register', methods=['POST'])
def register():
data = request.get_json()
if not data or not data.get('username') or not data.get('password') or not data.get('email'):
return jsonify({'message': 'Datos incompletos'}), 400
if User.query.filter((User.username == data['username']) | (User.email == data['email'])).first():
return jsonify({'message': 'El usuario o email ya existe'}), 400
# Asignar un rol por defecto si no se especifica (ej: el ID del rol investigador)
default_role = Role.query.filter_by(name='investigador').first()
new_user = User(
username=data['username'],
email=data['email'],
role_id=default_role.id if default_role else None
)
new_user.set_password(data['password'])
db.session.add(new_user)
db.session.commit()
return jsonify({'message': 'Usuario registrado con éxito'}), 201
@auth_bp.route('/login', methods=['POST'])
def login():
data = request.get_json()
if not data or not data.get('username') or not data.get('password'):
return jsonify({'message': 'Credenciales requeridas'}), 400
user = User.query.filter_by(username=data['username']).first()
if not user or not user.check_password(data['password']):
return jsonify({'message': 'Usuario o contraseña incorrectos'}), 401
# Generación del JWT Token
payload = {
'user_id': user.id,
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=2)
}
token = jwt.encode(payload, os.environ.get('JWT_SECRET_KEY', 'secret'), algorithm='HS256')
return jsonify({
'token': token,
'user': user.to_dict()
}), 200
@auth_bp.route('/me', methods=['GET'])
@token_required
def me(current_user):
# 'current_user' es inyectado automáticamente por nuestro middleware 'token_required'
return jsonify(current_user.to_dict()), 200