Skip to main content

🔐 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