Aller au contenu principal

POST /api/login

Authentifie un utilisateur et retourne un token JWT.

Endpoint​

POST /api/login

Headers​

HeaderValeurRequis
Content-Typeapplication/jsonOui

Corps de la requête​

{
"email": "string",
"password": "string"
}
ChampTypeRequisDescription
emailstringOuiAdresse email de l'utilisateur
passwordstringOuiMot de passe

Réponse succès​

Code : 200 OK

{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
"refresh_token": "d1f2a3b4c5e6f7g8h9i0j1k2l3m4n5o6",
"user": {
"id": "0f8fad5b-d9cb-469f-a165-70867728950e",
"email": "agent@example.org",
"roles": ["ROLE_USER"],
"roleLabel": "Spécialiste Transferts Monétaires",
"nom": "Exemple",
"prenom": "Agent",
"totpEnabled": false,
"passwordExpired": false,
"mustChangePassword": false,
"passwordExpiresIn": 75,
"passwordWarning": null,
"region": null
}
}
ChampTypeDescription
tokenstringJeton JWT d'accès (durée : 1 heure)
refresh_tokenstringJeton de rafraîchissement (durée : 30 jours, renouvelé à chaque rafraîchissement)
userobjectUtilisateur connecté ; ses permissions se lisent ensuite avec GET /api/me/permissions

En plus du corps, la réponse pose trois cookies : BEARER (JWT, httpOnly), REFRESH_TOKEN (httpOnly) et XSRF-TOKEN (lisible par le navigateur). Un client qui s'authentifie par cookie doit recopier la valeur de XSRF-TOKEN dans l'en-tête X-CSRF-TOKEN de chaque requête POST, PUT, PATCH ou DELETE ; un client qui envoie l'en-tête Authorization: Bearer sans cookie n'est pas concerné.

Double authentification (2FA)​

Si l'utilisateur a activé la 2FA, la connexion ne délivre pas encore de jeton utilisable :

{
"requires2FA": true,
"message": "Verification 2FA requise",
"user": { "id": "…", "email": "agent@example.org", "totpEnabled": true }
}

Le client envoie ensuite le code à 6 chiffres à POST /api/2fa/verify, qui délivre le JWT et le refresh token. Les autres routes 2FA (/api/2fa/setup, enable, disable, status, login-history) gèrent l'activation depuis le profil.

Réponses erreur​

401 Unauthorized - Identifiants invalides​

{
"code": 401,
"message": "Invalid credentials."
}

400 Bad Request - Données manquantes​

{
"code": 400,
"message": "The key \"email\" must be provided."
}

403 Forbidden - Compte désactivé​

{
"code": 403,
"message": "Account is disabled."
}

Exemples​

cURL​

curl -X POST https://sig.example.com/api/login \
-H "Content-Type: application/json" \
-d '{
"email": "admin@pch-sig.sn",
"password": "<MOT_DE_PASSE>"
}'

JavaScript​

const login = async (email, password) => {
const response = await fetch('https://sig.example.com/api/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ email, password })
});

if (!response.ok) {
throw new Error('Authentication failed');
}

const data = await response.json();

// Stocker le token
localStorage.setItem('token', data.token);
localStorage.setItem('refresh_token', data.refresh_token);

return data;
};

Python​

import requests

response = requests.post(
'https://sig.example.com/api/login',
json={
'email': 'admin@pch-sig.sn',
'password': '<MOT_DE_PASSE>'
}
)

if response.status_code == 200:
data = response.json()
token = data['token']
print(f"Connecté en tant que {data['user']['email']}")
else:
print(f"Erreur: {response.json()['message']}")

Utilisation du token​

Une fois le token obtenu, incluez-le dans le header Authorization pour les requêtes suivantes :

curl https://sig.example.com/api/menages \
-H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."

Structure du token JWT​

Le token contient les informations suivantes (payload décodé) :

{
"iat": 1705312345,
"exp": 1705315945,
"roles": ["ROLE_ADMIN"],
"email": "admin@pch-sig.sn",
"user_id": 1
}
ChampDescription
iatTimestamp de création
expTimestamp d'expiration
rolesRôles de l'utilisateur
emailEmail de l'utilisateur
user_idID de l'utilisateur

Notes​

  • Le token expire après 1 heure
  • Utilisez le refresh_token pour obtenir un nouveau token sans re-saisir les identifiants
  • Ne stockez jamais le token dans un endroit non sécurisé
  • En production, utilisez toujours HTTPS