Desarrollando un API con Laravel Sanctum
Laravel Sanctum proporciona un sistema de autenticación ligero para SPA (aplicaciones de una sola página), aplicaciones móviles y API simples basadas en tokens. Sanctum permite que cada usuario de su aplicación genere múltiples tokens API para su cuenta. A estos tokens se les pueden otorgar habilidades/alcances que especifican qué acciones pueden realizar los tokens. (Laravel Sanctum)
Crear proyecto
Para crear el proyecto base, lo realizaré siguiente el tutorial Primeros pasos con Laravel Sail.
Preparar la base de datos
Correr las migraciones default del proyecto
php artisan migrate
Crear Factory y Seeder para generar registros falsos en nuestra tabla de usuarios.
Para el Factory de los usuarios, no debemos generar ninguna acción, ya que este ya está creado, si queremos revisarlo, podemos revisar database/factories/UserFactory.php.
En cuanto al seeder, lo único que se debe hacer es ir a database/seeders/DatabaseSeeder.php y quitar los comentarios de la línea que llama al factory del usuario, quedando así
public function run()
{
\App\Models\User::factory(10)->create();
}
Correr el seeder
php artisan db:seed
Al revisar la base de datos, específicamente la tabla de usuarios, veremos que ya contamos con 10 de ellos
Controlador, colección y recurso del API
Para responder correctamente, en primer lugar se debe crear un recurso
php artisan make:resource V1/UserResource
El cual debe quedar de la siguiente manera
<?phpnamespace App\Http\Resources\V1;use Illuminate\Http\Resources\Json\JsonResource;class UserResource extends JsonResource
{
public function toArray($request)
{
return [
'name' => $this->name,
'email' => $this->email
];
}
}
Con el recurso creado, se debe generar la colección, para que en esta, también se utilice el recurso
php artisan make:resource V1/UserCollection
Luego, debe quedar de la siguiente manera
<?phpnamespace App\Http\Resources\V1;use Illuminate\Http\Resources\Json\ResourceCollection;class UserCollection extends ResourceCollection
{
public $collects = UserResource::class; public function toArray($request)
{
return parent::toArray($this->collects);
}
}
Proceder a crear el controlador del usuario, para que lo podamos utilizar como endpoint en las pruebas
php artisan make:controller Api/V1/UserController --api --model=User
Con fines de prueba, sólo se trabaja en los métodos index y show, los cuales deben quedar de la siguiente manera
public function index()
{
return new UserCollection(User::latest()->paginate());
}public function show(User $user)
{
return new UserResource($user);
}
Controlador login
Para que un usuario obtenga el token, es requerido crear el controlador de login
php artisan make:controller Api/V1/LoginController
El código que debe tener este controlador, es algo como lo siguiente
<?php
namespace App\Http\Controllers\Api\V1;use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;class LoginController extends Controller
{
public function login(Request $request)
{
$this->validateLogin($request); if (!Auth::attempt($request->only('email', 'password'))) {
return response()->json([
'message' => 'Unauthorized'
], 401);
} return response()->json([
'token' => $request->user()->createToken($request->device)->plainTextToken,
'message' => 'Success'
]);
} public function validateLogin(Request $request)
{
return $request->validate([
'email' => 'required|email',
'password' => 'required',
'device' => 'required'
]);
}
}
Instalar y configurar Sanctum
Instalar la dependencia
composer require laravel/sanctum
Es requerido indicar en el modelo del usuario que usaremos la propiedad del token
use Laravel\Sanctum\HasApiTokens;Class User extends Authenticatable {
user HasFactory, Notifiable, HasApiTokens;
}
Actualizar la base de datos con Sanctum
php artisan migrate
Configuración de rutas
Se deben generar las rutas correspondientes, esto se hace en
<?phpuse Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;use App\Http\Controllers\Api\V1\UserController as UserV1;Route::apiResource('v1/posts', UserV1::class)
->only(['index', 'show'])
->middleware('auth:sanctum');Route::post('login', [
App\Http\Controllers\Api\V1\LoginController::class,
'login'
]);
Pruebas
Para realizar las pruebas correspondiente, se utilizará Postman. Es muy importante considerar que, para realizar los llamados, se debe agregar el header Accept application/json.
La primera prueba es solicitar obtener los usuarios, y al no estar autenticado, obtener un error
Ahora, se debe realizar el login para obtener el key
Se debe tomar ese token, y agregarlo como Authorization Bearer, de la siguiente manera
Con esto, ya tenemos un flujo básico de proteger un endpoint, generar nuestro token con Sanctum, y consultar la información necesaria sin inconvenientes.