Creo que faltó un pedazo al inicio del video, para instalar Sanctum debe hacerse con el siguiente código desde la terminal:
composer require laravel/sanctum
Implementa autenticación en Laravel con confianza: desde el scaffolding básico de registro con Laravel UI hasta la protección de rutas API con Laravel Sanctum, pruebas automatizadas sin errores 401 y emisión de tokens seguros con un controlador de acción única. Todo con sesiones basadas en cookies, protección CSRF y defensa ante XSS para SPA.
Configuración de autenticación con Laravel UI y Sanctum
Para iniciar, Laravel ofrece varios tipos de autenticación. Primero, Laravel UI brinda un scaffolding básico para registro y acceso por web. Luego, Sanctum habilita autenticación para SPA y APIs con sesiones y cookies o con tokens personales.
¿Cómo habilitar el scaffolding de Laravel UI?
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" php artisan migrate
¿Qué trait y middleware activan Sanctum para SPA?
use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens; // habilita creación de tokens }
protected $middlewareGroups = [ 'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, // ... ], ];
¿Cómo proteger rutas API con auth:sanctum?
// routes/api.php Route::middleware('auth:sanctum')->get('/ruta-protegida', function () { return 'OK'; });
Pruebas de autenticación con Sanctum
Al proteger las rutas con auth:sanctum, tus pruebas pueden fallar con 401. Sanctum provee una forma simple de simular un usuario autenticado en tests.
¿Qué indica un 401 en los tests?
¿Cómo usar Sanctum::actingAs con factory?
use Laravel\Sanctum\Sanctum; use App\Models\User; Sanctum::actingAs(User::factory()->create());
¿Cómo aplicar autenticación en setUp?
protected function setUp(): void { parent::setUp(); Sanctum::actingAs(User::factory()->create()); }
Generación de tokens con un Single Action Controller
Para emitir tokens personales, crea un controlador de acción única que valide credenciales y retorne el token en formato JSON.
¿Cómo crear el controlador y validar el request?
php artisan make:controller UserTokenController
namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\ValidationException; class UserTokenController extends Controller { public function __invoke(Request $request) { $data = $request->validate([ 'email' => ['required', 'email'], 'password' => ['required'], 'device_name' => ['required'], ]); $user = User::where('email', $data['email'])->first();
¿Cómo verificar credenciales y lanzar errores?
if (! $user || ! Hash::check($data['password'], $user->password)) { throw ValidationException::withMessages([ 'email' => 'El email no existe o no coincide con nuestros datos.', ]); }
¿Cómo crear el token, ruta y probar el endpoint?
$token = $user->createToken($data['device_name'])->plainTextToken; return response()->json(['token' => $token]); } }
use App\Http\Controllers\UserTokenController; Route::post('/sanctum-token', UserTokenController::class);
{ "email": "usuario@correo.com", "password": "secreto", "device_name": "mi-dispositivo" }
¿Quieres que revisemos tu configuración o tu flujo de pruebas con Sanctum? Cuéntame en los comentarios qué parte te gustaría profundizar y en qué entorno estás trabajando.
Implementa autenticación en Laravel con confianza: desde el scaffolding básico de registro con Laravel UI hasta la protección de rutas API con Laravel Sanctum, pruebas automatizadas sin errores 401 y emisión de tokens seguros con un controlador de acción única. Todo con sesiones basadas en cookies, protección CSRF y defensa ante XSS para SPA.
Para iniciar, Laravel ofrece varios tipos de autenticación. Primero, Laravel UI brinda un scaffolding básico para registro y acceso por web. Luego, Sanctum habilita autenticación para SPA y APIs con sesiones y cookies o con tokens personales.
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens; // habilita creación de tokens
}
protected $middlewareGroups = [
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
// ...
],
];
// routes/api.php
Route::middleware('auth:sanctum')->get('/ruta-protegida', function () {
return 'OK';
});
Al proteger las rutas con auth:sanctum, tus pruebas pueden fallar con 401. Sanctum provee una forma simple de simular un usuario autenticado en tests.
use Laravel\Sanctum\Sanctum;
use App\Models\User;
Sanctum::actingAs(User::factory()->create());
protected function setUp(): void
{
parent::setUp();
Sanctum::actingAs(User::factory()->create());
}
Para emitir tokens personales, crea un controlador de acción única que valide credenciales y retorne el token en formato JSON.
php artisan make:controller UserTokenController
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
class UserTokenController extends Controller
{
public function __invoke(Request $request)
{
$data = $request->validate([
'email' => ['required', 'email'],
'password' => ['required'],
'device_name' => ['required'],
]);
$user = User::where('email', $data['email'])->first();
if (! $user || ! Hash::check($data['password'], $user->password)) {
throw ValidationException::withMessages([
'email' => 'El email no existe o no coincide con nuestros datos.',
]);
}
$token = $user->createToken($data['device_name'])->plainTextToken;
return response()->json(['token' => $token]);
}
}
use App\Http\Controllers\UserTokenController;
Route::post('/sanctum-token', UserTokenController::class);
{
"email": "usuario@correo.com",
"password": "secreto",
"device_name": "mi-dispositivo"
}
¿Quieres que revisemos tu configuración o tu flujo de pruebas con Sanctum? Cuéntame en los comentarios qué parte te gustaría profundizar y en qué entorno estás trabajando.
Creo que faltó un pedazo al inicio del video, para instalar Sanctum debe hacerse con el siguiente código desde la terminal:
composer require laravel/sanctum
demasiados DEMASIADOSSS criterios sin explicar en este curso, perdido totalmente apesar de haber visto los anteriores de php y laravel, lo extraño es que cuando habla se le entiende lo que dice, se nota que tampoco es arrogante y su lenguaje y manera de explicar es muy amigable, que paso aqui platzi???
Se extraña al profesor Italo uu
Si están utilizando PostMan deben de modificar el Header Accept para que solo de respuesta Postman acepte del tipo application/json.
Quedaría algo como:
Accept: application/json
La validación dentro de UserTokenController, debería quedar así, ésto para que en caso de que el usuario no exista o la contraseña no es correcta, nos lance el mensaje de error.
if (!$user || !Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'email' => ['El email no existe o no coincide con nuestros datos.'],
]);
}
Para crear el usuario pueden utilizar tinker
php artisan tinker
App\User::create(['name'=>'nombre','email'=>'correo@dominio.com','password'=>Illuminate\Support\Facades\Hash::make('contraseña')];
el video esta cortado no esta la parte de laravel ui
Hay muchos errores empezando por la logica mal implementada en el Throw
Esto esta mal porque literlamente dice: Si el usuario no existe y si el password no coincide
if (!$user && !Hash::check($request->password, $user->password) {
Lo correcto seria:
if (!$user || !Hash::check($request->password, $user->password) {
Publico algunos cambios en mi UserTokenController que a mi me ha funcionado mejor:
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Support\Facades\Hash;
use App\Http\Requests\UserTokenRequest;
use Illuminate\Validation\ValidationException;
class UserTokenController extends Controller
{
public function __invoke(UserTokenRequest $request)
{
$user = User::where('email', $request->email)->first();
if ( !$user->exists() || !Hash::check($request->password, $user->password) ) {
throw ValidationException::withMessages([
'email' => 'El usuario no se encuentra o es incorrecto'
]);
}
return response()->json([
'token' => $user->createToken($request->device_name)->plainTextToken
]);
}
}
Crees que sea mejor el uso de Sanctum o Laravel-Passport ?