Les mots de passe sont le maillon faible de la sécurité des comptes. Ils peuvent être hameçonnés, divulgués, réutilisés ou oubliés. C’est pourquoi nous avons ajouté le support des Passkeys WebAuthn - une méthode d’authentification sans mot de passe résistante au phishing, à la fois plus sécurisée et plus pratique.

Que sont les Passkeys ?

Les Passkeys sont des identifiants cryptographiques stockés sur votre appareil (téléphone, ordinateur portable, clé de sécurité) qui remplacent les mots de passe pour l’authentification. Ils utilisent le standard WebAuthn (partie de FIDO2) et offrent plusieurs avantages :

  • Résistants au phishing - Les Passkeys sont liés au domaine du site web, ils ne peuvent donc pas être utilisés sur des sites frauduleux
  • Aucun secret à divulguer - Seule la clé publique est stockée sur le serveur
  • Liés à l’appareil - La clé privée ne quitte jamais votre appareil
  • Protégés par biométrie - Généralement sécurisés par Face ID, Touch ID ou Windows Hello
  • Synchronisation multi-appareils - Les plateformes modernes synchronisent les Passkeys entre les appareils via les comptes iCloud, Google ou Microsoft

Notre implémentation

Nous avons intégré le support des Passkeys WebAuthn dans notre pile d’authentification django-allauth existante, fournissant des endpoints API pour le web et le mobile.

Flux d’inscription

Lorsqu’un utilisateur enregistre un nouveau Passkey, le flux fonctionne ainsi :

  1. Le client demande les options d’inscription au serveur
  2. Le serveur génère un défi avec les informations de l’utilisateur et de la partie de confiance
  3. L’API WebAuthn du navigateur sollicite l’utilisateur (biométrie ou clé de sécurité)
  4. Le client envoie les identifiants au serveur
  5. Le serveur vérifie et stocke la clé publique
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# API endpoint to begin registration
class WebAuthnRegistrationOptionsView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        from allauth.mfa.webauthn.internal import auth as webauthn_auth

        # Generate credential creation options
        creation_options = webauthn_auth.begin_registration(
            request.user,
            passwordless=False  # Use as 2FA, not passwordless
        )

        return Response({
            "success": True,
            "creation_options": creation_options,
        })

Flux d’authentification

Pour l’authentification à deux facteurs avec un Passkey :

  1. L’utilisateur complète l’authentification primaire (identifiant/mot de passe ou connexion sociale)
  2. Le serveur retourne un défi pour la vérification WebAuthn
  3. Le navigateur demande le Passkey (toucher biométrique)
  4. Les identifiants sont vérifiés par rapport à la clé publique stockée
  5. L’utilisateur est entièrement authentifié
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class WebAuthnVerifyView(APIView):
    def post(self, request):
        credential = request.data.get("credential")

        # Complete authentication and verify credential
        authenticator = webauthn_auth.complete_authentication(
            request.user,
            credential
        )

        # Record usage for security monitoring
        authenticator.last_used_at = timezone.now()
        authenticator.save()

        return Response({"success": True})

Gestion des Passkeys

Les utilisateurs peuvent gérer leurs Passkeys enregistrés :

  • Lister tous les Passkeys avec la date d’inscription et la dernière utilisation
  • Renommer les Passkeys pour une identification plus facile (ex., “iPhone”, “MacBook”)
  • Supprimer les Passkeys (avec protection contre la suppression du dernier authentificateur)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class WebAuthnListView(APIView):
    def get(self, request):
        authenticators = Authenticator.objects.filter(
            user=request.user,
            type=Authenticator.Type.WEBAUTHN
        ).order_by("-created_at")

        return Response({
            "passkeys": [
                {
                    "id": auth.pk,
                    "name": auth.wrap().name,
                    "created_at": auth.created_at.isoformat(),
                    "last_used_at": auth.last_used_at.isoformat() if auth.last_used_at else None,
                }
                for auth in authenticators
            ]
        })

Endpoints API

Notre API REST fournit un support complet WebAuthn pour l’application mobile :

EndpointMéthodeDescription
/api/webauthn/register/options/GETObtenir le défi d’inscription
/api/webauthn/register/complete/POSTCompléter l’inscription
/api/webauthn/authenticate/options/GETObtenir le défi d’authentification
/api/webauthn/verify/POSTVérifier les identifiants pour 2FA
/api/webauthn/GETLister les Passkeys enregistrés
/api/webauthn/<id>/PATCHRenommer un Passkey
/api/webauthn/<id>/DELETESupprimer un Passkey

Considérations de sécurité

Codes de récupération

Lorsqu’un utilisateur enregistre son premier authentificateur (Passkey ou TOTP), nous générons automatiquement des codes de récupération. Ces codes à usage unique peuvent être utilisés si toutes les autres méthodes d’authentification deviennent indisponibles :

1
2
if Authenticator.objects.filter(user=request.user).count() == 1:
    auto_generate_recovery_codes(request._request)

Prévention du verrouillage

Les utilisateurs ne peuvent pas supprimer leur dernier Passkey si cela les laisserait sans aucune méthode d’authentification à deux facteurs :

1
2
3
4
if not adapter.can_delete_authenticator(authenticator):
    return Response({
        "message": "Cannot delete - you must have at least one authentication method"
    }, status=400)

Surveillance

Nous suivons l’utilisation des Passkeys via les métriques Datadog pour la surveillance de la sécurité :

1
2
3
increment("webauthn.registration.success")
increment("webauthn.verify.success")
increment("webauthn.verify.failed")

Support des navigateurs

WebAuthn est supporté par tous les navigateurs modernes :

  • Chrome 67+
  • Firefox 60+
  • Safari 13+
  • Edge 79+
  • Chrome mobile, Safari, Firefox

Pour les navigateurs plus anciens, les utilisateurs peuvent toujours utiliser TOTP (applications d’authentification) ou les codes de récupération.

L’expérience utilisateur

Ajouter un Passkey ne prend que quelques secondes :

  1. Allez dans Paramètres → Sécurité → Authentification à deux facteurs
  2. Cliquez sur Ajouter un Passkey
  3. Nommez votre appareil (ex., “iPhone 15”)
  4. Authentifiez-vous avec Face ID / Touch ID / Windows Hello
  5. C’est fait ! Votre Passkey est enregistré

Les connexions futures ne nécessitent qu’une confirmation biométrique - plus besoin de taper des mots de passe ou de copier des codes d’applications d’authentification.

Pourquoi nous avons choisi les Passkeys

MéthodeRisque de phishingExpérience utilisateurRécupération
Mots de passeÉlevéMauvaise (oubliés, faibles)Réinitialisation par email
SMS 2FAMoyen (échange de SIM)CorrectNuméro de téléphone
Applications TOTPFaibleSaisie manuelle de codeClés de sauvegarde
PasskeysTrès faibleExcellenteCodes de récupération

Les Passkeys représentent l’avenir de l’authentification. Ils sont déjà supportés par les plateformes Apple, Google et Microsoft, les rendant accessibles à presque tous nos utilisateurs.


Prêt à passer au sans mot de passe ? Activez les Passkeys dans vos paramètres de sécurité !