Ir al contenido principal

Laravel Sanctum: modelo PersonalAccessToken y tabla personal_access_tokens

Cita de la doc de Sanctum: Although not typically required, you are free to extend the PersonalAccessToken model used internally by Sanctum.

 

¿Qué quiere decir que se puede extender el modelo PersonalAccessToken?



¡Claro! Ese texto explica una capacidad importante de Laravel Sanctum que te da más flexibilidad para personalizar la autenticación de tu API.

Básicamente, lo que te dice es lo siguiente:

"Aunque normalmente no sea necesario, eres libre de extender el modelo PersonalAccessToken usado internamente por Sanctum."

Vamos a desglosarlo:

  • "PersonalAccessToken model": Cuando instalas Laravel Sanctum y ejecutas sus migraciones (php artisan migrate), se crea una tabla en tu base de datos llamada personal_access_tokens. Esta tabla almacena todos los tokens de API que se generan para tus usuarios. El "modelo PersonalAccessToken" es la representación Eloquent de esa tabla en Laravel. Es el objeto PHP que Laravel usa para interactuar con los datos de cada token (como el ID, el nombre, las habilidades/scopes, la fecha de expiración, etc.).

  • "usado internamente por Sanctum": Este modelo es el corazón de cómo Sanctum gestiona y verifica los tokens. Cada vez que un usuario se autentica con un token, o un token es generado o revocado, Sanctum interactúa con este modelo y su tabla asociada.

  • "aunque normalmente no sea necesario": Para la gran mayoría de las aplicaciones y necesidades de autenticación, el modelo PersonalAccessToken que Sanctum provee por defecto es perfectamente suficiente. Ya incluye campos para el nombre del token, las habilidades (abilities), la fecha de última utilización (last_used_at), y la fecha de expiración (expires_at).

  • "eres libre de extender": Esto significa que si las funcionalidades por defecto del modelo PersonalAccessToken no son suficientes para tus necesidades específicas, tienes la capacidad de modificar o añadirle funcionalidades.


¿Por qué querrías extender el modelo PersonalAccessToken?

Podrías extenderlo si, por ejemplo:

  1. Necesitas almacenar información adicional sobre el token: Imagina que quieres guardar el user_agent desde el que se creó el token, o la IP desde la que se usa, o un campo is_revoked_by_admin para un tipo específico de revocación.
  2. Necesitas lógica personalizada para la gestión de tokens: Podrías querer sobrescribir cómo se comprueban las habilidades (can()) para añadir una lógica más compleja, o añadir métodos personalizados para buscar tokens de una manera específica.
  3. Integración con otros sistemas: Si tienes un sistema de logs o auditoría muy específico, podrías añadir eventos o observadores al modelo PersonalAccessToken.

¿Cómo se extendería?

  1. Crearías tu propio modelo de Laravel que extienda el modelo base de Sanctum:
    PHP
    // app/Models/MyCustomAccessToken.php
    <?php
    
    namespace App\Models;
    
    use Laravel\Sanctum\PersonalAccessToken as SanctumPersonalAccessToken;
    
    class MyCustomAccessToken extends SanctumPersonalAccessToken
    {
        // Aquí puedes añadir tus nuevos campos (asegurándote de agregarlos también a la migración de la tabla)
        // Por ejemplo: protected $fillable = ['name', 'token', 'abilities', 'last_used_at', 'expires_at', 'user_agent'];
        // Y aquí puedes añadir tus propios métodos o sobrescribir los existentes
        public function wasCreatedFromMobile()
        {
            // Lógica para determinar si el token fue creado desde un móvil, si guardaste esa info
            return str_contains($this->user_agent ?? '', 'Mobile');
        }
    }
    
  2. Le dirías a Sanctum que use tu nuevo modelo en lugar del predeterminado. Esto se hace en el archivo de configuración de Sanctum (config/sanctum.php):
    PHP
    // config/sanctum.php
    'token_model' => App\Models\MyCustomAccessToken::class,
    
  3. Si añades nuevos campos, también tendrías que crear una nueva migración para añadir esas columnas a la tabla personal_access_tokens.

En resumen, la frase te da la libertad de personalizar un componente central de Sanctum si las características predeterminadas no satisfacen todas tus necesidades, manteniendo la extensibilidad que caracteriza a Laravel.

Comentarios

Entradas populares de este blog

Crear proyecto de frontend con Vite, React, Tailwind, Typescript y JSX

 ¿Cómo se crea un proyecto exclusivo de frontend con Vite, React, Tailwind, Typescript y JSX? ¡Absolutamente! Entiendo que quieres la guía completa para pasar de cero a tener un proyecto de frontend moderno, vacío y listo para ser llenado con tu código. A continuación, te proporciono un archivo de guía detallada que incluye todos los comandos necesarios para inicializar el proyecto, configurar Tailwind CSS, y los pasos clave para empezar a "poblarlo". Voy a generar un documento Markdown con la guía paso a paso, incluyendo los comandos de terminal y las modificaciones esenciales a los archivos de configuración. Guía: Creación de un Proyecto Frontend Puro (Vite, React, TypeScript, Tailwind) Este documento detalla el proceso para inicializar un proyecto de frontend vacío y optimizado, utilizando Vite como empaquetador, React como librería, TypeScript para tipado y Tailwind CSS para estilizado. 1. Inicialización del Proyecto con Vite Vite es la herramienta más rápida para emp...

Tokens V2

Tokens: Programme to discover tokens, where there are not. Now available at  https://puszcza.gnu.org.ua/projects/tokens/ This is Version 2, for  version 1, go here . Synopsis: use TokensV2; sub printFile; my @FORMAT = ( ['<Message Date=".*?" Time=".*?" DateTime=".*?" SessionID=".*?"><From>(?:<User FriendlyName=".*?"/>)+</From><To>(?:<User FriendlyName=".*?"/>)+</To><Text(?: Style=".*?")?>.*?</Text></Message>',   sub {     my $fh = $_[1];     my ($d, $t, $f, $s, $T) = $_[0] =~ m|<Message Date="(.*?)" Time="(.*?)" DateTime=".*?" SessionID=".*?">(<From>(?:<User FriendlyName=".*?"/>)+</From>)<To>(?:<User FriendlyName=".*?"/>)+</To><Text(?: Style="(.*?)")?>(.*?)</Text></Message>|;     my $F = join '<br />', ...

Perl Net::LDAP::SimpleServer

Adaptaciones sobre el módulo LDAP Server para Windows (Strawberry Perl) Lista de adaptaciones (continúa más abajo): - Relajación de condiciones de bind:     - Cuenta principal (principal account)     - Validación de contraseñas Ubicación del archivo: %Strawberry_Perl%\site\lib\net\ldap\SimpleServer\ProtocolHandler.pm CPAN: http://search.cpan.org/~russoz/Net-LDAP-SimpleServer-0.0.17/lib/Net/LDAP/SimpleServer.pm Código: package Net::LDAP::SimpleServer::ProtocolHandler; use strict; use warnings; # ABSTRACT: LDAP protocol handler used with Net::LDAP::SimpleServer our $VERSION = '0.0.17';    # VERSION use Net::LDAP::Server; use base 'Net::LDAP::Server'; use fields qw(store root_dn root_pw allow_anon); use Carp; use Net::LDAP::LDIF; use Net::LDAP::Util qw{canonical_dn}; use Net::LDAP::FilterMatch; use Net::LDAP::Constant (     qw/LDAP_SUCCESS LDAP_AUTH_UNKNOWN LDAP_INVALID_CREDENTIALS/,   ...