Laravel Sanctum: Autenticación para Modelos Diversos

Fernando GPFernando GP
2 min read

Como sabemos, Laravel Sanctum nos permite implementar autenticación basada en tokens de forma sencilla y eficiente. Aunque generalmente se utiliza para autenticar usuarios, también es posible adaptarlo para manejar la autenticación de otros modelos en tu aplicación.

Esto es posible gracias a que, si inspeccionamos la tabla personal_access_tokens, veremos que utiliza una relación polimórfica a través de las columnas tokenable_type y tokenable_id. Esto nos permite asociar los tokens con diferentes modelos, ofreciendo una gran flexibilidad para implementar autenticación en diversos contextos.

Para lograrlo, lo único que necesitamos es agregar el trait HasApiTokens al modelo que deseemos autenticar. Este trait incluye los métodos necesarios para interactuar con los tokens, permitiendo generar, validar y revocar tokens fácilmente.

Imaginemos que necesitamos poder autenticar por medio de un token al modelo Employee

Lo que deberíamos hacer es implementar HasApiTokens en dicho modelo

<?php

namespace App\Models;

use Laravel\Sanctum\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Employee extends Authenticatable
{
    use HasApiTokens;
}

Con esto ahora nuestro modelo tiene la capacidad de poder generar tokens y de usar estos tokens para autenticación.

$employee = Employee::first();
$token = $employee->createToken('token')->plainTextToken;

¡Y listo! Ahora, para poder autenticar dicho token, basta con hacer uso del middleware auth:sanctum en nuestras rutas.

Route::middleware('auth:sanctum')->group(function() {
    Route::get('/user', function(Request $request) {
        return $request->user();
    });
});

Es muy importante cambiar el middleware que viene por default auth:api por auth:sanctum caso contario no funcionara.

¡Happy coding! 🚀

0
Subscribe to my newsletter

Read articles from Fernando GP directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Fernando GP
Fernando GP