EmDash utilise l’authentification par passkey comme méthode de connexion principale. Les passkeys résistent au phishing, ne nécessitent pas de mots de passe et fonctionnent sur tous les appareils via votre navigateur ou gestionnaire de mots de passe.
Pour les déploiements Cloudflare, vous pouvez optionnellement utiliser Cloudflare Access comme fournisseur d’authentification alternatif.
Fonctionnement
Les passkeys utilisent WebAuthn, un standard web qui crée des identifiants à clé publique stockés sur votre appareil ou synchronisés via votre gestionnaire de mots de passe. Lors de la connexion, votre appareil prouve la possession de l’identifiant sans jamais envoyer de mot de passe sur le réseau.
Avantages de l’authentification par passkey :
- Aucun mot de passe à retenir ou à divulguer
- Résistant au phishing — les identifiants sont liés au domaine de votre site
- Synchronisation inter-appareils — fonctionne avec le trousseau iCloud, Google Password Manager, 1Password, etc.
- Connexion rapide — une seule touche avec biométrie ou code PIN
Configuration du premier utilisateur
La première fois que vous accédez au panneau d’administration, l’assistant de configuration vous guide pour créer votre compte administrateur.
-
Allez sur
http://localhost:4321/_emdash/admin -
Vous serez redirigé vers l’assistant de configuration. Saisissez :
- Site Title — Le nom de votre site
- Tagline — Une courte description
- Admin Email — Votre adresse e-mail
-
Cliquez sur Create Site pour enregistrer votre passkey
-
Votre navigateur vous demandera de créer une passkey :
- Sur macOS : Touch ID, mot de passe de l’appareil ou clé de sécurité
- Sur Windows : Windows Hello ou clé de sécurité
- Sur mobile : Face ID, empreinte digitale ou code PIN
-
Une fois votre passkey enregistrée, vous êtes connecté et redirigé vers le tableau de bord d’administration.
Connexion
Après la configuration, revenir au panneau d’administration déclenche l’authentification par passkey :
-
Allez sur
/_emdash/admin -
Si vous n’êtes pas connecté, la page de connexion s’affiche
-
Cliquez sur Sign in pour vous authentifier
-
Votre navigateur demande votre passkey (biométrie, code PIN ou clé de sécurité)
-
Après vérification, vous êtes redirigé vers le tableau de bord d’administration
Lien magique de secours
Si vous ne pouvez pas utiliser votre passkey (ex. appareil perdu), les liens magiques offrent une alternative. L’e-mail doit être configuré au préalable.
-
Sur la page de connexion, cliquez sur Sign in with email
-
Saisissez votre adresse e-mail
-
Consultez votre boîte de réception pour trouver le lien de connexion
-
Cliquez sur le lien pour vous authentifier (valide 15 minutes)
Connexion OAuth
EmDash prend en charge la connexion OAuth avec GitHub et Google lorsqu’ils sont configurés. Les utilisateurs peuvent lier leurs comptes après la configuration initiale de la passkey.
Consultez le guide de configuration pour les instructions de mise en place.
Rôles utilisateurs
EmDash utilise un contrôle d’accès par rôles à cinq niveaux :
| Rôle | Niveau | Description |
|---|---|---|
| Subscriber | 10 | Accès en lecture seule |
| Contributor | 20 | Créer du contenu (nécessite approbation) |
| Author | 30 | Créer/modifier/publier son propre contenu |
| Editor | 40 | Gérer tout le contenu |
| Admin | 50 | Accès complet, y compris les paramètres |
Chaque rôle hérite des permissions de tous les niveaux inférieurs. Le premier utilisateur est toujours créé en tant qu’Admin.
Inviter des utilisateurs
Les administrateurs peuvent inviter de nouveaux utilisateurs via le panneau d’administration :
-
Allez dans Settings > Users
-
Cliquez sur Invite User
-
Saisissez l’e-mail de l’utilisateur et sélectionnez un rôle
-
Cliquez sur Send Invite
-
L’utilisateur reçoit un e-mail avec un lien d’invitation
-
Il clique sur le lien et enregistre sa passkey
Les invitations sont valides 7 jours. Les administrateurs peuvent renvoyer ou révoquer les invitations depuis la page Utilisateurs.
Gestion des passkeys
Les utilisateurs peuvent gérer leurs passkeys depuis les paramètres du compte :
- Ajouter une passkey — Enregistrer des passkeys supplémentaires comme sauvegarde ou pour d’autres appareils
- Supprimer une passkey — Supprimer les passkeys que vous n’utilisez plus
- Renommer une passkey — Donner des noms descriptifs aux passkeys
Chaque utilisateur peut avoir jusqu’à 10 passkeys enregistrées.
Inscription libre
Pour les sites d’équipe, vous pouvez activer l’inscription libre pour des domaines e-mail spécifiques :
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
auth: {
selfSignup: {
domains: ["example.com"],
defaultRole: "contributor",
},
},
}),
],
});
Les utilisateurs avec un domaine e-mail correspondant peuvent s’inscrire sans invitation. Ils recevront un e-mail de vérification et enregistreront une passkey pour finaliser l’inscription.
Configuration des sessions
Les sessions utilisent des cookies sécurisés HttpOnly avec des valeurs par défaut raisonnables :
emdash({
auth: {
session: {
maxAge: 30 * 24 * 60 * 60, // 30 jours (par défaut)
sliding: true, // Réinitialise l'expiration à chaque activité
},
},
});
Notes de sécurité
- Les passkeys sont stockées comme clés publiques — la clé privée ne quitte jamais votre appareil
- La vérification par défi empêche les attaques par rejeu
- La limitation de débit protège contre la force brute (5 tentatives/minute/IP)
- Les sessions sont HttpOnly, Secure, SameSite=Lax pour la sécurité des cookies
- Les jetons de lien magique sont hachés en SHA-256 — les jetons bruts ne sont jamais stockés
Dépannage
« No passkeys registered »
Si vous voyez cette erreur à la connexion, votre passkey a peut-être été supprimée de votre gestionnaire de mots de passe. Demandez à un administrateur de vous envoyer un lien magique ou une nouvelle invitation.
« Passkey authentication failed »
Cela signifie généralement que la passkey a été créée pour un domaine différent. Les passkeys sont liées au domaine — une passkey pour localhost:4321 ne fonctionnera pas sur example.com. Enregistrez une nouvelle passkey pour chaque domaine.
« Session expired »
Les sessions durent 30 jours par défaut avec expiration glissante. Si vous êtes déconnecté de manière inattendue, effacez vos cookies et reconnectez-vous.
Perte de toutes les passkeys
Si vous avez perdu l’accès à toutes vos passkeys enregistrées :
- Demandez à un autre administrateur de vous envoyer un lien magique (nécessite la configuration de l’e-mail)
- Utilisez le lien magique pour vous connecter
- Enregistrez une nouvelle passkey dans les paramètres du compte
Si vous êtes le seul administrateur et que l’e-mail n’est pas configuré, vous devrez réinitialiser l’authentification de votre site via la base de données.
Cloudflare Access
Lors d’un déploiement sur Cloudflare, vous pouvez utiliser Cloudflare Access comme fournisseur d’authentification au lieu des passkeys. Access gère l’authentification en périphérie à l’aide de votre fournisseur d’identité existant.
Pourquoi utiliser Cloudflare Access ?
- Authentification unique (SSO) — Les utilisateurs s’authentifient avec l’IdP de votre entreprise
- Contrôle d’accès centralisé — Gérez qui peut accéder à l’admin depuis le tableau de bord Cloudflare
- Pas de gestion de passkeys — Pas besoin d’enregistrer ou gérer des passkeys
- Rôles par groupe — Associez automatiquement les groupes IdP aux rôles EmDash
Configuration
- Créez une application Cloudflare Access pour votre site EmDash
- Notez le Application Audience (AUD) Tag dans les paramètres de l’application
- Configurez EmDash pour utiliser Access :
import { defineConfig } from "astro/config";
import cloudflare from "@astrojs/cloudflare";
import emdash from "emdash/astro";
import { d1, access } from "@emdash-cms/cloudflare";
export default defineConfig({
output: "server",
adapter: cloudflare(),
integrations: [
emdash({
database: d1({ binding: "DB" }),
auth: access({
teamDomain: "myteam.cloudflareaccess.com",
audience: "abc123def456...", // Depuis les paramètres de l'app Access
}),
}),
],
});
Options de configuration
| Option | Type | Défaut | Description |
|---|---|---|---|
teamDomain | string | requis | Domaine de votre équipe Access (ex. myteam.cloudflareaccess.com) |
audience | string | requis | Application Audience (AUD) tag depuis les paramètres Access |
autoProvision | boolean | true | Créer les utilisateurs EmDash à la première connexion Access |
defaultRole | number | 30 | Rôle pour les utilisateurs ne correspondant à aucun groupe (30 = Author) |
syncRoles | boolean | false | Mettre à jour le rôle à chaque connexion selon les groupes IdP |
roleMapping | object | — | Associer les noms de groupes IdP aux niveaux de rôle |
audienceEnvVar | string | "CF_ACCESS_AUDIENCE" | Nom de la variable d’environnement pour le tag audience (alternative au codage en dur) |
Correspondance des rôles
Associez vos groupes IdP aux rôles EmDash :
emdash({
auth: access({
teamDomain: "myteam.cloudflareaccess.com",
audience: "abc123...",
roleMapping: {
Admins: 50, // Admin
"Content Editors": 40, // Editor
Writers: 30, // Author
},
defaultRole: 20, // Contributor pour les utilisateurs n'appartenant à aucun groupe
}),
});
Le premier groupe correspondant l’emporte si un utilisateur appartient à plusieurs groupes. Le premier utilisateur à accéder au site devient toujours Admin, indépendamment des groupes.
Comportement de synchronisation des rôles
Par défaut (syncRoles: false), le rôle d’un utilisateur est défini lors de sa première connexion et ne change plus ensuite. Cela permet aux administrateurs d’ajuster manuellement les rôles dans EmDash.
Définissez syncRoles: true si vous souhaitez que les groupes IdP fassent autorité — le rôle de l’utilisateur sera mis à jour à chaque connexion selon ses groupes actuels.
Fonctionnement
- L’utilisateur visite
/_emdash/admin - Cloudflare Access intercepte et redirige vers votre IdP
- L’utilisateur s’authentifie (SSO, MFA, etc.)
- Access place un JWT signé dans la requête
- EmDash valide le JWT et crée/authentifie l’utilisateur
Fonctionnalités désactivées
Lorsque Access est activé, ces fonctionnalités ne sont pas disponibles :
- Page de connexion (
/_emdash/admin/login) - Enregistrement et gestion des passkeys
- Connexion OAuth
- Connexion par lien magique
- Inscription libre
- Invitations d’utilisateurs
La gestion des utilisateurs se fait entièrement via vos politiques Cloudflare Access.
Dépannage
« No Access JWT present »
La requête a atteint EmDash sans JWT Access. Cela signifie :
- Access n’est pas configuré pour protéger votre application
- La politique Access ne couvre pas les routes admin
Vérifiez que votre application Access couvre /_emdash/admin/*.
« JWT audience mismatch »
Le audience dans votre configuration ne correspond pas au JWT. Vérifiez le Application Audience Tag dans les paramètres de votre application Access.
« User not authorized »
L’utilisateur s’est authentifié via Access mais autoProvision est false et il n’existe pas dans EmDash. Soit :
- Définissez
autoProvision: true, soit - Créez l’utilisateur manuellement avant sa première connexion