Skip to content

Add Passkey authentication (WebAuthn/FIDO2) #3165

@Mips2648

Description

@Mips2648

Nouvelle fonctionnalité : Authentification via Passkey (WebAuthn/FIDO2)

L’objectif est d’ajouter la possibilité de se connecter avec une passkey (WebAuthn/FIDO2) directement depuis la page de login.

Les passkeys sont des identifiants numériques sécurisés basés sur WebAuthn/FIDO2, utilisables uniquement sur des connexions HTTPS, qui remplacent les mots de passe par une authentification simple, résistante au phishing et ne nécessitant plus de double authentification (2FA).

Détails de mise en œuvre

Gestion des passkeys (dans les préférences utilisateur)

  • Ajout d’un nouvel onglet dans l’écran des préférences utilisateur dédié aux passkeys.
  • L’utilisateur peut enregistrer un nombre illimité de passkeys.
  • Les passkeys doivent être des resident keys (plus conviviales et adaptées à une utilisation multi-appareils).
  • Pour chaque passkey enregistrée, afficher :
    • Date de création (avec heure précise).
    • Date de dernière utilisation (avec heure précise).
  • Possibilité de :
    • Renommer une passkey pour la distinguer facilement.
    • Supprimer une passkey (y compris la dernière restante).

Authentification (sur la page de login)

  • Ajout d’un bouton « Se connecter avec une passkey ».
  • Ce bouton déclenche le flux WebAuthn/FIDO2 standard :
    1. Détection des passkeys disponibles sur l’appareil/navigateur.
    2. Sélection et validation par l’utilisateur (via biométrie, PIN, etc.).
    3. Vérification côté serveur et ouverture de session si succès.
  • En cas d’échec (aucune passkey trouvée, refus utilisateur, erreur navigateur), retour à l’écran de login classique.

Sécurité et contraintes

  • Les passkeys doivent être stockées et gérées conformément aux spécifications WebAuthn/FIDO2.
  • Les opérations de suppression et de renommage doivent être journalisées pour audit.
  • Prévoir une fallback : si aucune passkey n’est disponible ou utilisable, l’utilisateur doit pouvoir se connecter avec son mot de passe habituel.

New Feature: Passkey (WebAuthn/FIDO2) Authentication

The goal is to enable login using a passkey (WebAuthn/FIDO2) directly from the login page.

Passkeys are secure digital credentials based on WebAuthn/FIDO2, usable only over HTTPS connections, replacing passwords with simple, phishing‑resistant authentication that no longer requires two‑factor authentication (2FA).

Implementation Details

Passkey Management (in user preferences)

  • Add a new tab in the user preferences screen dedicated to passkeys.
  • Users can register an unlimited number of passkeys.
  • Passkeys should be resident keys (more user-friendly and suitable for multi-device usage).
  • For each registered passkey, display:
    • Creation date (with exact time).
    • Last usage date (with exact time).
  • Allow users to:
    • Rename a passkey for easier identification.
    • Delete a passkey (including the last one).

Authentication (on login page)

  • Add a “Login with passkey” button.
  • This button triggers the standard WebAuthn/FIDO2 flow:
    1. Detect available passkeys on the device/browser.
    2. User selects and validates (via biometrics, PIN, etc.).
    3. Server verifies and grants session if successful.
  • If the flow fails (no passkey found, user cancels, browser error), fall back to the classic login screen.

Security and Constraints

  • Passkeys must be stored and managed according to WebAuthn/FIDO2 specifications.
  • Deletion and renaming operations should be logged for audit purposes.
  • Fallback required: if no passkey is available, users must still be able to log in with their password.

A new table will be required to store user passkeys

Table: user_passkeys

Column Type Constraints / Notes
id INT PK Unique identifier for the passkey
user_id INT FK Reference to users.id
name VARCHAR(255) Custom name for the passkey (editable by the user)
credential_id VARBINARY(255) Unique identifier of the key (WebAuthn credentialId, stored as base64/hex)
public_key VARBINARY(2048) Associated public key (stored for server-side verification)
sign_count INT Usage counter (WebAuthn spec, protects against cloned credentials)
aaguid CHAR(36) Authenticator Attestation GUID (UUID, identifies the authenticator type)
created_at TIMESTAMP Date and time of creation
last_used_at TIMESTAMP NULL Date and time of last usage (NULL if never used)

Recommended Indexes

  • (user_id)
  • (credential_id) unique

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions