Skip to content

Authentification

XetaSuite utilise Laravel Sanctum en mode stateful (cookies) pour l’authentification SPA. Aucun token API n’est stocké côté client.

Terminal window
sequenceDiagram
participant SPA as React SPA
participant Laravel as Laravel Backend
SPA->>Laravel: GET /sanctum/csrf-cookie
Laravel-->>SPA: Set XSRF-TOKEN cookie
SPA->>Laravel: POST /api/v1/auth/login (+ credentials)
Laravel-->>SPA: Set session cookie
SPA->>Laravel: GET /api/v1/user (with cookies)
Laravel-->>SPA: User data + permissions
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS',
'localhost,localhost:5173,127.0.0.1,xetasuite.test'
)),
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_origins' => [env('FRONTEND_URL', 'http://localhost:5173')],
'supports_credentials' => true,
const httpClient = axios.create({
baseURL: import.meta.env.VITE_API_URL || '',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-Requested-With': 'XMLHttpRequest',
},
withCredentials: true, // ⚠️ Obligatoire pour Sanctum
withXSRFToken: true, // Auto-inclut le header X-XSRF-TOKEN
});
  1. Obtenir le cookie CSRF

    await axios.get('/sanctum/csrf-cookie');
  2. Envoyer les credentials

    await httpClient.post('/api/v1/auth/login', {
    email: 'admin@xetasuite.test',
    password: 'password',
    remember: true
    });
  3. Récupérer l’utilisateur

    const { data } = await httpClient.get('/api/v1/user');
    // data contient: user, roles[], permissions[]
// Dans les composants React
const {
hasPermission,
hasRole,
hasAnyPermission,
hasAnyRole,
isOnHeadquarters
} = useAuth();
// Vérifier une permission
if (hasPermission('company.create')) {
// Afficher le bouton de création
}
// Vérifier un rôle
if (hasRole('admin')) {
// Afficher le panel admin
}
// Vérifier plusieurs permissions
if (hasAnyPermission(['company.update', 'company.delete'])) {
// Afficher le menu
}
// Vérifier plusieurs rôles
if (hasRole(['admin', 'manager'])) {
// Afficher le bouton d'édition utilisateur
}
// Vérifier si l'utilisateur est sur le site siège
if (isOnHeadquarters()) {
// L'utilisateur est sur le site siège
}