Authentification

Sur cette page

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.

  1. Allez sur http://localhost:4321/_emdash/admin

  2. 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
  3. Cliquez sur Create Site pour enregistrer votre passkey

  4. 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
  5. 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 :

  1. Allez sur /_emdash/admin

  2. Si vous n’êtes pas connecté, la page de connexion s’affiche

  3. Cliquez sur Sign in pour vous authentifier

  4. Votre navigateur demande votre passkey (biométrie, code PIN ou clé de sécurité)

  5. 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.

  1. Sur la page de connexion, cliquez sur Sign in with email

  2. Saisissez votre adresse e-mail

  3. Consultez votre boîte de réception pour trouver le lien de connexion

  4. 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ôleNiveauDescription
Subscriber10Accès en lecture seule
Contributor20Créer du contenu (nécessite approbation)
Author30Créer/modifier/publier son propre contenu
Editor40Gérer tout le contenu
Admin50Accè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 :

  1. Allez dans Settings > Users

  2. Cliquez sur Invite User

  3. Saisissez l’e-mail de l’utilisateur et sélectionnez un rôle

  4. Cliquez sur Send Invite

  5. L’utilisateur reçoit un e-mail avec un lien d’invitation

  6. 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 :

  1. Demandez à un autre administrateur de vous envoyer un lien magique (nécessite la configuration de l’e-mail)
  2. Utilisez le lien magique pour vous connecter
  3. 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

  1. Créez une application Cloudflare Access pour votre site EmDash
  2. Notez le Application Audience (AUD) Tag dans les paramètres de l’application
  3. 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

OptionTypeDéfautDescription
teamDomainstringrequisDomaine de votre équipe Access (ex. myteam.cloudflareaccess.com)
audiencestringrequisApplication Audience (AUD) tag depuis les paramètres Access
autoProvisionbooleantrueCréer les utilisateurs EmDash à la première connexion Access
defaultRolenumber30Rôle pour les utilisateurs ne correspondant à aucun groupe (30 = Author)
syncRolesbooleanfalseMettre à jour le rôle à chaque connexion selon les groupes IdP
roleMappingobjectAssocier les noms de groupes IdP aux niveaux de rôle
audienceEnvVarstring"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

  1. L’utilisateur visite /_emdash/admin
  2. Cloudflare Access intercepte et redirige vers votre IdP
  3. L’utilisateur s’authentifie (SSO, MFA, etc.)
  4. Access place un JWT signé dans la requête
  5. 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