Auth

CookieAuthStrategy

Strategia di autenticazione basata su cookie HTTP-only emessi dal backend. Token invisibile a JavaScript, massima mitigazione XSS.

Cosa fa

CookieAuthStrategy delega completamente al backend la gestione delle credenziali: lato client si limita ad abilitare withCredentials: true su ogni richiesta, cosi il browser allega automaticamente i cookie cross-origin (vincolo CORS).

Il token e contenuto in un cookie con flag HttpOnly, Secure, SameSiteinvisibile a JavaScript per design (mitigazione XSS).

Quando usarla

  • Applicazioni con backend che gestisce sessioni server-side
  • Massima protezione contro XSS (token non esfiltrabile da JS)
  • Integrazione con sistemi legacy/SSR che usano cookie di sessione
  • Quando il backend e nello stesso dominio o ha CORS con Access-Control-Allow-Credentials: true
E la scelta consigliata per il massimo livello di sicurezza. Anche se la SPA viene compromessa da XSS, il token non puo essere letto ne esfiltrato — il browser lo allega solo alle richieste verso l'origine autorizzata.

Costruttore

class CookieAuthStrategy implements IAuthStrategy {
  constructor()
}

Nessun parametro. La configurazione effettiva del cookie e responsabilita esclusiva del backend.

Comportamento

  • applyAuth(config) — imposta withCredentials: true sulla richiesta
  • isAuthenticated() — ritorna un flag locale aggiornato da saveCredentials/clearCredentials. JS non puo leggere cookie HttpOnly, quindi non e possibile dedurre lo stato dal cookie stesso
  • saveCredentials(authResponse) — porta il flag interno isAuth a true (chiamata dopo POST /auth/login con esito 2xx)
  • clearCredentials() — porta il flag a false (chiamata dopo POST /auth/logout)
  • getToken() / getRefreshToken() — restituiscono sempre null: il token e invisibile a JS by design
  • supportsRefresh()true: il refresh va orchestrato lato server tramite endpoint che si affida al cookie del browser
Poiche getToken() ritorna null, le richieste manuali che richiedono il token nell'header (es. per debug) non sono possibili con questa strategy. Tutto passa via cookie automatico del browser.

Configurazione backend

Esempio response al login (lato server):

HTTP/1.1 200 OK
Set-Cookie: auth_token=eyJhbGc...; HttpOnly; Secure; SameSite=Strict; Path=/; Max-Age=3600
Set-Cookie: refresh_token=...; HttpOnly; Secure; SameSite=Strict; Path=/auth/refresh; Max-Age=604800
Content-Type: application/json

{ "success": true }

Flag cookie:

  • HttpOnly — non leggibile da document.cookie
  • Secure — inviato solo su HTTPS
  • SameSite=Strict|Lax — protezione CSRF
  • Path=/auth/refresh — refresh token visibile solo all'endpoint dedicato

CORS

Con backend cross-origin, il server deve rispondere con:

Access-Control-Allow-Origin: https://app.example.com   # NON wildcard *
Access-Control-Allow-Credentials: true

E il client withCredentials: true (gestito automaticamente dalla strategy).

Esempio

import {
  AuthStrategyFactory,
  AuthServiceFactory,
  HttpClientFactory,
} from '@pzeta/postgrest'

const httpClient = HttpClientFactory.createFetchClient({
  baseURL: 'https://api.example.com',
})
const strategy = AuthStrategyFactory.createCookieStrategy()
const authService = AuthServiceFactory.create(httpClient, strategy)

httpClient.setAuthStrategy(strategy)
httpClient.setAuthHandler(authService)

await authService.login({ email, password })
// Da questo punto le richieste portano automaticamente il cookie di sessione

Vedi anche