You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
7.9 KiB
PHP
245 lines
7.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\User;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class AuthController extends Controller
|
|
{
|
|
/**
|
|
* Registro de usuario
|
|
*/
|
|
public function register(Request $request)
|
|
{
|
|
try {
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'required|string|max:255|regex:/^[\pL\s\-]+$/u',
|
|
'email' => 'required|email|unique:users,email|max:255',
|
|
'password' => [
|
|
'required',
|
|
'string',
|
|
'min:8',
|
|
'confirmed',
|
|
'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/'
|
|
],
|
|
], [
|
|
'password.regex' => 'La contraseña debe contener al menos una mayúscula, una minúscula, un número y un carácter especial.',
|
|
'name.regex' => 'El nombre solo puede contener letras y espacios.',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'errors' => $validator->errors()
|
|
], 422);
|
|
}
|
|
|
|
$user = User::create([
|
|
'name' => strip_tags(trim($request->name)),
|
|
'email' => strtolower(trim($request->email)),
|
|
'password' => Hash::make($request->password),
|
|
'email_verified_at' => null, // Para implementar verificación de email después
|
|
]);
|
|
|
|
$user->assignRole('administrador');
|
|
|
|
// Registrar actividad
|
|
Log::info('Usuario registrado', ['user_id' => $user->id, 'email' => $user->email]);
|
|
|
|
// Crear token de acceso
|
|
$token = $user->createToken('api_token', ['*'], now()->addHours(12))->plainTextToken;
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Usuario registrado exitosamente',
|
|
'user' => [
|
|
'id' => $user->id,
|
|
'name' => $user->name,
|
|
'email' => $user->email,
|
|
'roles' => $user->getRoleNames(),
|
|
'permissions' => $user->getAllPermissions()->pluck('name')
|
|
],
|
|
'token' => $token,
|
|
'token_type' => 'Bearer',
|
|
'expires_in' => 12 * 60 * 60 // 12 horas en segundos
|
|
], 201);
|
|
|
|
} catch (\Exception $e) {
|
|
Log::error('Error en registro', [
|
|
'error' => $e->getMessage(),
|
|
'trace' => $e->getTraceAsString()
|
|
]);
|
|
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Error en el servidor. Por favor, intente más tarde.'
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Login de usuario
|
|
*/
|
|
public function login(Request $request)
|
|
{
|
|
try {
|
|
$validator = Validator::make($request->all(), [
|
|
'email' => 'required|email|max:255',
|
|
'password' => 'required|string',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'errors' => $validator->errors()
|
|
], 422);
|
|
}
|
|
|
|
$credentials = [
|
|
'email' => strtolower(trim($request->email)),
|
|
'password' => $request->password
|
|
];
|
|
|
|
// Intentar autenticación
|
|
if (!Auth::attempt($credentials)) {
|
|
// Registrar intento fallido
|
|
Log::warning('Intento de login fallido', ['email' => $request->email]);
|
|
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Credenciales inválidas'
|
|
], 401);
|
|
}
|
|
|
|
$user = User::where('email', $credentials['email'])->firstOrFail();
|
|
|
|
// Verificar si el usuario está activo (puedes agregar un campo 'is_active' después)
|
|
// if (!$user->is_active) {
|
|
// return response()->json(['error' => 'Cuenta desactivada'], 403);
|
|
// }
|
|
|
|
// Revocar tokens anteriores (opcional, para seguridad)
|
|
$user->tokens()->delete();
|
|
|
|
// Crear nuevo token con expiración
|
|
$token = $user->createToken('api_token', ['*'], now()->addHours(12))->plainTextToken;
|
|
|
|
// Registrar login exitoso
|
|
Log::info('Login exitoso', ['user_id' => $user->id]);
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Login exitoso',
|
|
'user' => [
|
|
'id' => $user->id,
|
|
'name' => $user->name,
|
|
'email' => $user->email,
|
|
'roles' => $user->getRoleNames(),
|
|
'permissions' => $user->getAllPermissions()->pluck('name')
|
|
],
|
|
'token' => $token,
|
|
'token_type' => 'Bearer',
|
|
'expires_in' => 12 * 60 * 60
|
|
]);
|
|
|
|
} catch (\Exception $e) {
|
|
Log::error('Error en login', [
|
|
'error' => $e->getMessage(),
|
|
'email' => $request->email
|
|
]);
|
|
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Error en el servidor. Por favor, intente más tarde.'
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Logout de usuario
|
|
*/
|
|
public function logout(Request $request)
|
|
{
|
|
try {
|
|
if ($request->user()) {
|
|
// Registrar logout
|
|
Log::info('Logout exitoso', ['user_id' => $request->user()->id]);
|
|
|
|
// Revocar todos los tokens del usuario
|
|
$request->user()->tokens()->delete();
|
|
}
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Sesión cerrada correctamente'
|
|
]);
|
|
|
|
} catch (\Exception $e) {
|
|
Log::error('Error en logout', ['error' => $e->getMessage()]);
|
|
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Error al cerrar sesión'
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Obtener usuario actual
|
|
*/
|
|
public function me(Request $request)
|
|
{
|
|
try {
|
|
$user = $request->user();
|
|
|
|
if (!$user) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Usuario no autenticado'
|
|
], 401);
|
|
}
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'user' => [
|
|
'id' => $user->id,
|
|
'name' => $user->name,
|
|
'email' => $user->email,
|
|
'roles' => $user->getRoleNames(),
|
|
'permissions' => $user->getAllPermissions()->pluck('name')
|
|
]
|
|
]);
|
|
|
|
} catch (\Exception $e) {
|
|
Log::error('Error obteniendo usuario', ['error' => $e->getMessage()]);
|
|
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Error obteniendo información del usuario'
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Refrescar token (opcional para implementar después)
|
|
*/
|
|
public function refresh(Request $request)
|
|
{
|
|
$user = $request->user();
|
|
$user->tokens()->delete();
|
|
|
|
$token = $user->createToken('api_token', ['*'], now()->addHours(12))->plainTextToken;
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'token' => $token,
|
|
'token_type' => 'Bearer',
|
|
'expires_in' => 12 * 60 * 60
|
|
]);
|
|
}
|
|
} |