viernes, 13 de junio de 2025

Laravel Sanctum: first party domain y first party session

  Los dominios de primera parte (first party domain) y las sesiones de primera parte (first party session) son conceptos clave para entender cómo funciona la autenticación de SPAs en Laravel Sanctum y cómo se diferencia de la autenticación por tokens de API.

En el contexto de Laravel Sanctum:

¿Qué es un "First-Party Domain" (Dominio de Primera Parte)?

Un "dominio de primera parte" (o "first-party domain") se refiere al escenario en el que tu aplicación frontend (SPA, por ejemplo, React, Vue, Angular) y tu API de Laravel backend comparten el mismo dominio de nivel superior.

Ejemplos de dominios de primera parte:

  • Producción:
    • Frontend: app.example.com
    • Backend (API): api.example.com
    • Ambos comparten el dominio de nivel superior example.com.
  • Desarrollo local:
    • Frontend: localhost:3000 (o localhost:5173 para Vite, etc.)
    • Backend (API): localhost:8000 (o 127.0.0.1:8000 con php artisan serve)
    • Ambos comparten el dominio de nivel superior localhost.

Lo crucial es que el navegador los considere parte del mismo "sitio" para fines de seguridad de cookies y CORS.

¿Por qué es importante el "First-Party Domain" en Sanctum?

Porque Laravel Sanctum utiliza esta condición para ofrecer un método de autenticación para SPAs que es similar a la autenticación de sesión tradicional basada en cookies de Laravel, pero adaptado a las necesidades de las SPAs.

Cuando una solicitud HTTP entrante a tu API de Laravel proviene de un dominio que has configurado como "first-party" en tu archivo config/sanctum.php (a través de la variable de entorno SANCTUM_STATEFUL_DOMAINS), Sanctum intentará autenticar la solicitud usando las cookies de sesión de Laravel.

Este comportamiento es ideal porque:

  • Es familiar: Funciona de manera muy similar a cómo Laravel siempre ha manejado la autenticación web.
  • Seguridad: Se beneficia de las protecciones incorporadas de Laravel, como la protección CSRF (Cross-Site Request Forgery) y la protección contra ataques XSS (Cross-Site Scripting) para las credenciales de autenticación.
  • Conveniencia: No necesitas manejar manualmente tokens de API en el lado del frontend para la autenticación; las cookies lo hacen por ti después de una solicitud inicial para obtener el token CSRF (/sanctum/csrf-cookie).

¿Está relacionado con "First-Party Session"?

Sí, están intrínsecamente relacionados y son la base de la autenticación de SPAs en Sanctum.

Cuando hablamos de "first-party session" en el contexto de Sanctum, nos referimos al mecanismo de autenticación basado en sesiones y cookies de Laravel que se activa específicamente cuando la solicitud proviene de un "first-party domain" configurado.

Laravel Sanctum tiene dos modos principales de autenticación:

  1. Autenticación por Tokens de API (Stateless): Para aplicaciones móviles, terceros, o SPAs que están en un dominio diferente (cross-origin). Aquí el cliente envía un token de tipo Bearer en el encabezado Authorization. Esta es una autenticación sin estado (stateless).
  2. Autenticación de SPA (Basada en Sesión de Primera Parte / Stateful): Para SPAs que residen en un "first-party domain" con respecto a la API. Para estas solicitudes, Sanctum utiliza las sesiones y cookies de Laravel, haciendo que la autenticación sea con estado (stateful).

Cómo funciona la "First-Party Session" con Sanctum:

  1. Tu SPA hace una solicitud GET a /sanctum/csrf-cookie. Laravel devuelve una cookie XSRF-TOKEN y establece la sesión.
  2. Tu SPA envía credenciales de inicio de sesión (usuario/contraseña) a tu endpoint de login (/api/login). El navegador incluye automáticamente la cookie XSRF-TOKEN y las cookies de sesión (porque es un dominio de primera parte).
  3. Laravel autentica al usuario y, si las credenciales son válidas, la sesión se activa y se crea una cookie de sesión que el navegador guardará y enviará automáticamente con cada solicitud subsiguiente.
  4. Para todas las solicitudes posteriores a endpoints protegidos por auth:sanctum desde esa misma SPA, el navegador enviará la cookie de sesión, y Sanctum la utilizará para autenticar al usuario. No se necesitan tokens explícitos en el encabezado Authorization para estas solicitudes.

En resumen:

  • First-Party Domain: El concepto de que tu frontend (SPA) y tu backend (API de Laravel) comparten el mismo dominio de nivel superior.
  • First-Party Session: El tipo de autenticación basada en cookies/sesiones que Laravel Sanctum activa cuando detecta que una solicitud proviene de un dominio que ha sido configurado como "first-party".

La interconexión es que el dominio de primera parte es una condición necesaria para que la autenticación de sesión de primera parte funcione en Sanctum.

No hay comentarios: