đ Authentification - Login
L'endpoint de connexion permet aux utilisateurs de s'authentifier et d'obtenir un token d'accĂšs JWT pour utiliser l'API FreeTrade.
Endpointâ
POST /auth/login
Descriptionâ
Authentifie un utilisateur avec ses identifiants (email/username et mot de passe) et retourne un token JWT avec les informations utilisateur, acteur et session.
ParamĂštres de requĂȘteâ
Headers requisâ
Content-Type: application/json
Corps de la requĂȘteâ
{
"username": "string", // Email ou nom d'utilisateur
"password": "string" // Mot de passe
}
Validation des paramĂštresâ
- username : Requis, chaĂźne non vide
- password : Requis, minimum 6 caractĂšres
RĂ©ponsesâ
â SuccĂšs (200 OK)â
{
"success": true,
"message": "Connexion réussie",
"result": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"username": "user@example.com",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"status": "ACTIVE",
"roleId": 2,
"lastConnectedAt": "2024-01-01T10:00:00Z"
},
"actor": {
"id": 1,
"type": "ADMIN",
"permissions": {
"users": ["read", "write"],
"reports": ["read"]
}
},
"session": {
"id": "session-123",
"expiresAt": "2024-01-01T12:00:00Z",
"ipAddress": "192.168.1.1",
"userAgent": "Mozilla/5.0..."
}
},
"errors": null,
"except": null
}
â Erreurs possiblesâ
400 Bad Request - DonnĂ©es manquantesâ
{
"success": false,
"message": "Données de validation invalides",
"result": null,
"errors": [
"username should not be empty",
"password must be longer than or equal to 6 characters"
],
"except": null
}
401 Unauthorized - Identifiants invalidesâ
{
"success": false,
"message": "Identifiants invalides",
"result": null,
"errors": ["INVALID_CREDENTIALS"],
"except": null
}
403 Forbidden - Compte bloquĂ©â
{
"success": false,
"message": "Compte bloqué ou suspendu",
"result": null,
"errors": ["ACCOUNT_BLOCKED"],
"except": null
}
404 Not Found - Utilisateur introuvableâ
{
"success": false,
"message": "Utilisateur non trouvé",
"result": null,
"errors": ["USER_NOT_FOUND"],
"except": null
}
500 Internal Server Errorâ
{
"success": false,
"message": "Erreur interne du serveur",
"result": null,
"errors": ["INTERNAL_ERROR"],
"except": "Détails techniques de l'erreur"
}
Exemples d'utilisationâ
cURLâ
curl -X POST http://localhost:3004/auth/login \
-H "Content-Type: application/json" \
-d '{
"username": "admin@example.com",
"password": "password123"
}'
JavaScript/Fetchâ
const response = await fetch('http://localhost:3004/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
username: 'admin@example.com',
password: 'password123'
})
});
const data = await response.json();
if (data.success) {
const token = data.result.access_token;
// Stocker le token pour les requĂȘtes suivantes
localStorage.setItem('access_token', token);
} else {
console.error('Erreur de connexion:', data.errors);
}
Pythonâ
import requests
url = "http://localhost:3004/auth/login"
payload = {
"username": "admin@example.com",
"password": "password123"
}
response = requests.post(url, json=payload)
data = response.json()
if data['success']:
token = data['result']['access_token']
print(f"Token obtenu: {token}")
else:
print(f"Erreur: {data['errors']}")
SĂ©curitĂ© et bonnes pratiquesâ
đ SĂ©curitĂ© du tokenâ
- Durée de vie : Le token JWT a une durée de vie limitée (configurable)
- Stockage : Stocker le token de maniÚre sécurisée (pas dans localStorage en production)
- HTTPS : Toujours utiliser HTTPS en production
- Rotation : Implémenter la rotation des tokens pour plus de sécurité
đĄïž Protection contre les attaquesâ
- Rate limiting : Limitation du nombre de tentatives de connexion
- Brute force : Protection contre les attaques par force brute
- Logging : Toutes les tentatives de connexion sont loggées
- IP tracking : Suivi des adresses IP suspectes
đ Audit et loggingâ
Chaque tentative de connexion génÚre un log avec :
- Timestamp de la tentative
- Adresse IP du client
- User-Agent
- Résultat (succÚs/échec)
- Raison de l'échec (si applicable)
Utilisation du tokenâ
Une fois le token obtenu, l'inclure dans toutes les requĂȘtes authentifiĂ©es :
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Exemple de requĂȘte authentifiĂ©eâ
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:3004/auth/profile
Gestion des erreurs cĂŽtĂ© clientâ
async function login(username, password) {
try {
const response = await fetch('/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const data = await response.json();
if (!data.success) {
// Gestion des erreurs spécifiques
switch (response.status) {
case 400:
throw new Error('Données invalides: ' + data.errors.join(', '));
case 401:
throw new Error('Identifiants incorrects');
case 403:
throw new Error('Compte bloqué ou suspendu');
case 404:
throw new Error('Utilisateur non trouvé');
default:
throw new Error('Erreur de connexion');
}
}
return data.result;
} catch (error) {
console.error('Erreur de connexion:', error.message);
throw error;
}
}
Statuts utilisateurâ
Les différents statuts d'utilisateur affectent la connexion :
- ACTIVE : Connexion autorisée
- PENDING : En attente de validation (connexion refusée)
- SUSPENDED : Temporairement suspendu (connexion refusée)
- BLOCKED : Bloqué définitivement (connexion refusée)
- ARCHIVED : Compte archivé (connexion refusée)
Prochaine étape : Profil utilisateur