Desarrollando un API con Laravel Sanctum

Nicolás F. Ormeño Rojas
4 min readFeb 10, 2021

--

Photo by Jonathan Marchal on Unsplash

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

Figura 1 Usuarios

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

Figura 2 Acceso denegado

Ahora, se debe realizar el login para obtener el key

Figura 3 Login

Se debe tomar ese token, y agregarlo como Authorization Bearer, de la siguiente manera

Figura 4 Obtener usuarios

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.

--

--