npm.io
0.1.0 • Published 18h ago

@mostajs/auth-dialects

Licence
AGPL-3.0-or-later
Version
0.1.0
Deps
0
Size
15 kB
Vulns
0
Weekly
0

@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/broadcast et 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 emailmatch=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)

facefinger/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/iris utilisent 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 dialectes
  • normalizePhone(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.

Keywords