Contenido del curso
Creación del proyecto
Planificación y mantenimiento
- 8

Planificación de rutas REST en Laravel
06:08 min - 9

Recursos y colecciones en Laravel API
12:59 min - 10

Recursos anidados en Laravel API
11:48 min - 11

Cómo reducir 932 consultas con Telescope
10:54 min - 12

CRUD de Recetas con Laravel y Symfony en Visual Studio Code
16:21 min - 13

Validación de Datos en Aplicaciones Web con Laravel
11:24 min
Funciones de seguridad
- 14

Autenticación vs. autorización
03:19 min - 15

Proteger rutas de API con Sanctum
09:27 min - 16

Ruta de login y tokens con Sanctum
Viendo ahora - 17

Corrección de bugs de seguridad en aplicaciones web
08:02 min - 18

Políticas de acceso en Laravel con Artisan
07:27 min - 19

Upload e validação de imagens em Laravel
07:56 min - 20

Qué es autenticación en la web
03:54 min
API Testing
API Breaking Changes
Conclusiones
Ruta de login y tokens con Sanctum
Resumen
Configurar el inicio de sesión en una API con Laravel implica algo más que generar un token desde la terminal. Necesitas una ruta pública, un controlador dedicado y una validación segura de credenciales para que cualquier aplicación cliente pueda autenticarse y recibir su token de acceso.
Este flujo es el mismo que usan apps móviles y SPAs cuando piden email, contraseña y nombre del dispositivo para devolver un token reutilizable.
Cómo defines la ruta pública de login en la API
La ruta de inicio de sesión debe vivir fuera del grupo protegido por autenticación, porque un invitado todavía no tiene token cuando intenta entrar [01:00].
En el archivo de rutas API declaras un endpoint login que apunta a un método store dentro de un nuevo LoginController. Esa separación mantiene limpia la lógica: una ruta para entrar, el resto del grupo para usuarios ya autenticados.
Para generar el controlador usas el comando de Artisan y lo guardas dentro de la carpeta API:
bash php artisan make:controller API/LoginController
¿Por qué la ruta de login va fuera del middleware de autenticación? Porque el usuario aún no tiene token. Si la proteges, nunca podría iniciar sesión. La ruta debe ser accesible como invitado.
Qué validaciones necesita el método store del LoginController
Dentro del método store recibes el Request y aplicas reglas claras antes de tocar la base de datos [03:10]. El usuario debe enviar tres campos obligatorios.
- email: requerido y con formato válido de correo.
- password: requerido para comparar contra la contraseña guardada.
- device_name: requerido para identificar desde dónde se conecta, por ejemplo iPhone, Android o una versión específica de la app.
El device_name es clave porque Sanctum lo usa como etiqueta del token. Así puedes ver qué dispositivos tienen sesión abierta y revocar uno sin afectar al resto.
Cómo verificas la contraseña con la fachada Hash
Después de validar, consultas el usuario con User::where('email', $request->email)->first(). Aquí entra la parte interesante: no puedes comparar contraseñas en texto plano porque en la base de datos están encriptadas [05:20].
La fachada Hash de Laravel resuelve esto. El método Hash::check() toma la contraseña que envía el usuario y la compara contra el hash almacenado, devolviendo true o false.
php if (!$user || !Hash::check($request->password, $user->password)) { return response()->json([ 'message' => 'Las credenciales son incorrectas' ], Response::HTTP_UNPROCESSABLE_ENTITY); }
Fíjate en la condición: si el usuario no existe o la contraseña no coincide, devuelves el mismo error. Esto evita filtrar pistas sobre qué cuentas existen en tu sistema.
¿Qué hace Hash::check exactamente? Recibe la contraseña en texto plano y el hash guardado. Internamente reaplica el algoritmo de encriptación y compara los resultados, sin nunca desencriptar nada.
Por qué el código de estado 422 es el correcto
Cuando las credenciales fallan, devuelves Response::HTTP_UNPROCESSABLE_ENTITY, que corresponde al código 422. Es la respuesta estándar cuando la petición está bien formada pero los datos no se pueden procesar, justo el caso de un email o password inválidos.
Usar la constante de Symfony en lugar del número suelto hace tu código más legible y evita errores de tipeo.
Cómo generar y devolver el token de acceso al usuario
Si la validación pasa y la contraseña coincide, llegas al camino feliz: emitir el token [08:40]. Aquí aprovechas el método createToken() de Sanctum sobre la instancia del usuario, pasándole el nombre del dispositivo recibido en la petición.
La respuesta JSON sigue una estructura limpia con datos y atributos:
php return response()->json([ 'data' => [ 'attributes' => [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'token' => $user->createToken($request->device_name)->plainTextToken, ] ] ], Response::HTTP_OK);
Devuelves el id, name, email y el token que la aplicación cliente guardará para autenticar las próximas peticiones. El estado 200 OK confirma que el login fue exitoso.
Qué clases necesitas importar en el controlador
Para que todo funcione, asegúrate de importar tres dependencias en la cabecera del archivo:
Illuminate\Support\Facades\Hashpara verificar la contraseña.Symfony\Component\HttpFoundation\Responsepara usar las constantes de estado HTTP.App\Models\Userpara consultar la tabla de usuarios.
Cómo probar el endpoint de login en Postman
Con el código listo, abres Postman y haces un POST a /api/login con header Accept: application/json para forzar respuestas JSON [11:30].
En el cuerpo envías el email registrado por el seeder, por ejemplo admin@admin.com, la contraseña password y el device_name como iPhone. Al enviar la petición, recibes el objeto con los atributos del usuario y el token recién creado.
Si cambias la contraseña por una incorrecta, la API responde con el mensaje "Las credenciales son incorrectas" y el estado 422. Si omites el device_name, el validador lanza el error pidiendo ese campo. Cada respuesta confirma que las reglas funcionan.
El punto importante: el flujo de autenticación con tokens es un estándar que está por encima de Laravel. Existen usuarios, existen tokens de acceso y existe un proceso de verificación de identidad. Aprende la capa conceptual y la herramienta deja de ser el obstáculo.
¿Te animas a extender este controlador con un endpoint de logout que revoque el token actual? Cuéntame cómo lo resolverías.