Documentation · Guides

Clés d’accès pour votre application.

Connexion par clé d’accès pour votre propre application, sans bâtir de base de données d’utilisateurs. Canner conserve la fiche d’utilisateur et la clé publique; votre application vérifie un jeton signé et ne stocke rien.

Les clés d’accès remplacent les mots de passe par l’empreinte, le visage ou le NIP que vos utilisateurs emploient déjà pour déverrouiller leur téléphone. Rien à retenir, rien à réinitialiser et — puisque la clé privée ne quitte jamais l’appareil — rien à dérober dans votre base de données.

Canner Auth vous offre cela sans le coût habituel d’exploitation. Vous obtenez une API; nous gardons les identifiants. Votre serveur n’interroge jamais une table d’utilisateurs, parce qu’elle n’existe pas : il vérifie un jeton signé de courte durée avec une clé publique, comme il le ferait pour n’importe quel JWT.

Comment tout s’articule

Une application d’authentificationest l’unité de configuration. Elle appartient à votre compte Canner, est liée à un seul domaine et produit deux clés :

  • une clé publiable (cnr_auth_pk_…) destinée à votre code côté client. Ce n’est pas un secret : elle ne fonctionne que depuis les origines que vous autorisez, sa publication ne coûte donc rien.
  • une clé secrète (cnr_auth_sk_…) pour votre serveur, sur les forfaits payants. Elle gère les utilisateurs finaux et émet des billets d’inscription, et ne doit jamais atteindre un navigateur.

Avant de commencer

Créez une application à Identité → Clé d’accès. Trois conditions d’abord : le courriel de votre compte est vérifié, vous avez un projet en ligne et vous avez une clé d’accès sur votre propre compte Canner. Cette dernière est délibérée — le produit peut écrire à vos utilisateurs, et nous ne confions cette capacité qu’aux comptes ayant prouvé un appareil réel.

Le domaine de votre application doit vous appartenir : soit votre-projet.canner.app, soit un domaine personnalisédéjà vérifié. C’est validé à chaque requête, pas seulement à la configuration.

1 — Demander un courriel

L’inscription commence par une adresse. Nous envoyons un lien de confirmation et renvoyons la même réponse dans tous les cas : votre formulaire ne peut donc jamais servir à découvrir quelles adresses ont un compte.

// 1. Ask for an email. We send a confirmation link.
await fetch("https://api.canner.ca/v1/auth/register/start", {
  method: "POST",
  headers: {
    authorization: `Bearer ${process.env.NEXT_PUBLIC_CANNER_AUTH_PUBLISHABLE_KEY}`,
    "content-type": "application/json",
  },
  body: JSON.stringify({ email }),
});
// The response is always { ok: true } — it never reveals whether the
// address already has an account.

2 — Associer une clé d’accès

Le lien envoyé par courriel ramène l’utilisateur sur votrepage avec un jeton à usage unique dans l’URL. Ce n’est pas un détail modifiable : une clé d’accès ne peut être créée que sur votre propre domaine, la cérémonie doit donc s’y dérouler. Indiquez la page d’arrivée à la création de l’application.

import { startRegistration } from "@simplewebauthn/browser";

// 2. The user clicks the emailed link and lands back on YOUR page with
//    ?canner_auth_token=… in the URL. Bind the passkey here.
const token = new URLSearchParams(location.search).get("canner_auth_token");

const { options, ceremony_id } = await api("/v1/auth/register/options", { token });
const attestation = await startRegistration({ optionsJSON: options });

const { token: jwt } = await api("/v1/auth/register/verify", {
  token, ceremony_id, response: attestation,
});

3 — Se connecter

La connexion ne demande aucun identifiant. Le navigateur propose la clé d’accès qu’il détient pour votre domaine, et l’assertion nous indique à qui elle appartient.

import { startAuthentication } from "@simplewebauthn/browser";

// No email, no password, no identifier — the browser offers whichever
// passkey it holds for your domain.
const { options, ceremony_id } = await api("/v1/auth/login/options", {});
const assertion = await startAuthentication({ optionsJSON: options });

const { token, expires_in, user_id } = await api("/v1/auth/login/verify", {
  ceremony_id, response: assertion,
});

4 — Vérifier le jeton côté serveur

C’est ici que « sans base de données » devient concret. Le jeton est un JWT ES256 standard; vérifiez-le avec n’importe quelle bibliothèque JWT à partir du JWKS public. Aucun appel vers nous, aucune recherche d’utilisateur, aucune table de sessions.

import { createRemoteJWKSet, jwtVerify } from "jose";

// Injected into your project automatically when the app is attached.
const JWKS = createRemoteJWKSet(new URL(process.env.CANNER_AUTH_JWKS_URL!));

export async function currentUser(req: Request) {
  const token = req.headers.get("authorization")?.replace("Bearer ", "");
  if (!token) return null;

  const { payload } = await jwtVerify(token, JWKS, {
    issuer: process.env.CANNER_AUTH_ISSUER,
    audience: process.env.CANNER_AUTH_APP_ID,
  });
  return { id: payload.sub, email: payload.email };
}

Attachez l’application à un projet et ces variables arrivent automatiquement dans son environnement au prochain déploiement — rien à recopier d’un tableau de bord à l’autre :

CANNER_AUTH_APP_ID=…
CANNER_AUTH_PUBLISHABLE_KEY=cnr_auth_pk_…
CANNER_AUTH_ISSUER=https://auth.canner.app/apps/…
CANNER_AUTH_JWKS_URL=https://auth.canner.app/apps/…/.well-known/jwks.json

La clé secrète n’est jamais injectée, car les variables d’environnement de compilation se retrouvent dans le paquet client de la plupart des cadriciels.

Applications sans interface et utilisateurs opaques

Si vos utilisateurs ne sont pas identifiés par courriel, sautez entièrement l’étape du courriel. Votre serveur appelle /v1/auth/tickets avec la clé secrète et son propre external_id, puis remet le billet obtenu à votre interface pour l’inscription. C’est votre application qui décide qui peut s’inscrire — la bonne place pour cette décision — car une clé publiable seule ne peut jamais associer une clé d’accès à un identifiant.

Une application configurée ainsi n’envoie aucun courriel, ce qui est le meilleur résultat possible pour la délivrabilité de tous.

Courriels

Sur le forfait gratuit, Canner envoie exactement trois messages, depuis auth.canner.app, avec le nom de votre application comme expéditeur : confirmer une adresse, confirmer une nouvelle clé d’accès et en récupérer une perdue. Rien d’autre, et les gabarits sont fixes. Les forfaits payants peuvent envoyer depuis leur propre domaine vérifié et personnaliser le texte.

La récupération remplace plutôt qu’elle n’ajoute : si toutes les clés d’accès sont perdues, les anciennes sont de toute façon inaccessibles, et les laisser en place signifierait qu’un appareil volé fonctionne encore après la récupération.

Forfaits

L’API de connexion est offerte sur tous les forfaits, y compris Démarrage— un projet gratuit peut faire de la vraie authentification par clé d’accès. Les forfaits payants ajoutent l’API de gestion, plus d’utilisateurs actifs mensuels, des limites de courriel plus élevées, plusieurs applications et un domaine d’envoi personnalisé.