@mostajs/auth-dialects
@mostajs/auth-dialects
Auteur : Dr Hamid MADANI drmdh@msn.com · Licence : AGPL-3.0-or-later
Membre du @mostajs/auth-stack (avec mosta-auth, mosta-auth-lite, mosta-auth-flow, mosta-sms-lite, mosta-smtp-lite, mosta-broadcast).
Registre zéro-dépendance des « variétés » de connexion — les dialectes —
pour l'authentification, dans l'esprit de @mostajs/orm (DB-agnostique, ports
injectés). Une variété de login = un dialecte.
Façon dialectes — même paradigme que les drivers de
@mostajs/sms-lite, les canaux de@mostajs/broadcastet les schémas de@mostajs/nomenclature: un registre extensible où l'on enregistre des variantes sans toucher au flux.
Deux familles (kind)
| Famille | Principe | Variétés |
|---|---|---|
magic-link |
sans mot de passe — le lien magique est livré par un/des canal(aux) | mail, sms (magic-sms-link), mail&sms |
biometric |
vérification sur l'appareil via WebAuthn/passkeys (déléguée à @mostajs/auth) |
face, finger, iris |
Catalogue par défaut (les 6)
| key | kind | status | canaux / mécanisme |
|---|---|---|---|
mail |
magic-link | active | email — match=email, resolve=findByEmail |
sms |
magic-link | active | sms (magic-sms-link) — match=numéro, resolve=findByPhone |
mail&sms |
magic-link | active | email+sms — comportement par défaut (compte avec email et numéro) |
face |
biometric | planned | face-api.js (client) + PWA scan (caméra) — provider=face-api, capture=pwa-scan |
finger |
biometric | planned | WebAuthn platform, uv=required (provider=webauthn) |
iris |
biometric | planned | WebAuthn platform, uv=required (provider=webauthn) |
face≠finger/iris: la reconnaissance faciale passe par face-api.js (ML côté navigateur) avec capture caméra en PWA (pwa-scan) — pas de WebAuthn.finger/irisutilisent l'authentificateur de plateforme WebAuthn.Réalité WebAuthn (finger/iris) : on ne peut pas exiger « iris » plutôt qu'« empreinte » — l'OS choisit la modalité (
userVerification: required) ; les deux noms sont du branding/UX sur un seul mécanisme.
Usage
import { createDialectRegistry } from '@mostajs/auth-dialects';
const reg = createDialectRegistry();
// 1) sélection par identifiant (email ou numéro)
const dialect = reg.select(identifier); // 'a@b.dz' → mail ; '+213…' → sms
if (dialect?.resolve) {
const user = await dialect.resolve(identifier, userRepo); // port { findByEmail, findByPhone }
if (user) { /* émettre le magic-link pour user.email, livrer selon dialect.channels */ }
}
// 2) introspection (UI / matrice / doc)
reg.byKind('biometric'); // [face, finger, iris]
reg.active(); // [mail, sms, mail&sms]
// 3) extension — ajouter une variété sans toucher au flux
reg.register({
key: 'whatsapp', label: 'WhatsApp', kind: 'magic-link', status: 'active',
match: (id) => String(id).startsWith('wa:'),
resolve: (id, repo) => repo.findByPhone(id),
});API
createDialectRegistry({ dialects? })→{ list, get, byKind, active, planned, select, register }defaultDialects()→ les 6 dialectesnormalizePhone(s)·looksLikePhone(id)·KINDS·STATUS
register(d) fait un upsert par key et place le dialecte en tête
(priorité de select). DB-agnostique : resolve dépend du port userRepo
fourni par le consumer.
Référence d'implémentation
Hadhinat incubator/app/auth.mjs consomme ce registre ; le transport SMS est
@mostajs/sms-lite (méthode magic-sms-link) ; la biométrie sera câblée via
WebAuthn de @mostajs/auth. Voir llms.txt.