POST /api/me/2fa/activate
- Headers :
- Authorization: Bearer <access_token>
- Réponse :
{
"otpauth_url": "otpauth://totp/YourSocial:test@example.com?secret=XXXX&issuer=YourSocial",
"qr_code_base64": "iVBORw0KGgoAAAANS..."
}POST /api/me/2fa/verify
- Headers :
- Authorization: Bearer <access_token>
- Body :
{
"code": "123456"
}- Réponse :
{
"success": true,
"message": "2FA activé avec succès."
}POST /api/login
- Body :
{
"email": "test@example.com",
"password": "testpass123",
"code": "123456" // Optionnel, requis si 2FA activé
}- Réponse si 2FA requis mais code manquant ou invalide :
{
"twofa_required": true,
"message": "Code 2FA requis." // ou "Code 2FA invalide."
}- Réponse si succès :
{
"access_token": "...",
"refresh_token": "..."
}POST /api/me/2fa/deactivate
- Headers :
- Authorization: Bearer <access_token>
- Body :
{
"code": "123456"
}- Réponse :
{
"success": true,
"message": "2FA désactivé avec succès."
}Pour protéger l'API contre les attaques par force brute, l'endpoint de connexion est limité à 5 tentatives par 5 minutes et par adresse IP.
- Endpoint concerné :
POST /api/login - Limite :
5 tentatives par 5 minutes, par IP - Réponse en cas de dépassement :
{
"message": "Trop de tentatives de connexion. Veuillez réessayer plus tard."
}- Comportement :
Toute nouvelle tentative depuis la même IP avant la fin du délai retournera ce message d'erreur.
{
"message": "Trop de tentatives de connexion. Veuillez réessayer plus tard."
}- Le code TOTP doit être généré par une application d'authentification (Google Authenticator, FreeOTP, etc.)
- Le QR code retourné lors de l'activation peut être scanné directement dans l'application.
- En cas de perte du code, l'utilisateur devra contacter le support pour réinitialiser le 2FA.
Pour restreindre l'accès à certaines fonctionnalités selon le rôle de l'utilisateur, utilisez le décorateur @role_required.
- ADMIN
- MODERATEUR
- UTILISATEUR
- PREMIUM
from users.permissions import role_required
@router.get("/admin/only", auth=AuthBearer())
@role_required(["ADMIN"])
def admin_only_view(request):
return {"message": "Bienvenue, administrateur !"}@router.get("/moderation", auth=AuthBearer())
@role_required(["ADMIN", "MODERATEUR"])
def moderation_view(request):
return {"message": "Bienvenue, modérateur ou admin !"}- Si l'utilisateur n'est pas authentifié : erreur 401 (Authentification requise)
- Si l'utilisateur n'a pas le bon rôle : erreur 403 (Permission refusée)
Utilisez ce décorateur sur toutes les routes nécessitant une restriction par rôle.