Nodefony 10.0.0-beta.5
Framework Node.js fullstack — HTTP & WebSocket, même contexte

Référence d'API — @nodefony/user

stable

Documentation › Référence d’API › @nodefony/user

Générée depuis les déclarations de types publiées de @nodefony/user 10.0.0-beta.5 : exactement ce que reçoit une application qui l’installe. Cette page n’existe dans aucun dépôt — pour la corriger, on corrige le TSDoc du code.

@nodefony/user#

import { … } from "@nodefony/user" — 73 symboles.

Classes (12)#

AnonymousUser#

class AnonymousUser implements IUser

Utilisateur non authentifié — implémente IUser sans credential.

Argon2idEncoder#

class Argon2idEncoder implements IPasswordEncoder

Encodeur de mot de passe Argon2id (RFC 9106) — recommandation NIST/OWASP 2026.

BaseUser#

class BaseUser implements IPasswordAuthenticatedUser

Implémentation POJO de référence d’un utilisateur — base partagée par tous les ORM.

BcryptEncoder#

class BcryptEncoder implements IPasswordEncoder

Encodeur de mot de passe bcrypt — implémentation de référence d’IPasswordEncoder.

IdentifierImmutableError#

class IdentifierImmutableError extends nodefonyError

Une mise à jour tente de RENOMMER un compte — l’identifiant est immuable.

IdentifierTakenError#

class IdentifierTakenError extends nodefonyError

Un compte local porte déjà cet identifiant — l’identifiant est UNIQUE dans l’annuaire, quel que soit le dépôt (index unique en SQL et en document, refus explicite en mémoire).

InMemoryUserRepository#

class InMemoryUserRepository implements IUserRepository

Annuaire d’utilisateurs en mémoire — implémentation de référence du contrat IUserRepository sur une Map (aucun ORM).

MigratingEncoder#

class MigratingEncoder implements IPasswordEncoder

Encodeur composite de migration d’algorithme — accepte les hashs legacy à la vérification, ne produit que des hashs au format courant.

PasswordPolicy#

class PasswordPolicy implements IPasswordBlocklist

Politique par défaut : six règles, de la moins chère à la plus chère.

UserNotFoundError#

class UserNotFoundError extends nodefonyError

Utilisateur introuvable dans la source d’identité — levée par les méthodes IUserProvider (contrat : jamais null, l’absence d’identité est un échec explicite).

UserService#

class UserService extends AbstractCrudService<IPasswordAuthenticatedUser, IUserRepository> implements IUserProvider, IPasswordVerifier, IOAuthUserProvisioner

WeakPasswordError#

class WeakPasswordError extends nodefonyError

Mot de passe refusé par la politique (connu-compromis / interdit) — code = 400.

Fonctions (20)#

assertUserContract#

function assertUserContract(present: Iterable<string>, origin: string, expected?: readonly IUserColumn[]): void

Refuse une entité utilisateur incomplète, en nommant chaque colonne absente ET ce qui la lit.

attachExtraColumns#

function attachExtraColumns<T extends object>(user: T, row: Readonly<Record<string, unknown>>, skip?: ReadonlySet<string>): T

Reporte sur un utilisateur reconstruit toutes les colonnes que BaseUser ne porte pas — horodatages de la ligne, et champs métier ajoutés par l’application.

authenticatedUser#

function authenticatedUser(): IUser | null

L’utilisateur AUTHENTIFIÉ de la requête courante, typé IUser — ou null (hors zone, anonyme, ou principal qui n’est pas un IUser).

createUserAdminApi#

function createUserAdminApi(container: Container): IAdminApi

Producteur IAdminApi du domaine utilisateur — exposé sous /nodefony/user/api/users. Défini DANS @nodefony/user (propriétaire du UserService/IUser) mais enregistré par un module bootable (@nodefony/security, via registerUserAdminApi) car @nodefony/user est une lib pure non-bootable — exactement le cas prévu par le core : un module qui ne dépend que de nodefony produit sa donnée d’admin.

describeSeedFailure#

function describeSeedFailure(cause: unknown, context: ISeedFailureContext): string

Rédige le message d’un semis raté : QUEL compte, QUELLE règle, QUEL geste.

encoderFromConfig#

function encoderFromConfig(specs: readonly IEncoderSpec[]): IPasswordEncoder

Traduit une liste ORDONNÉE de specs d’encodeurs en encodeur exécutable — le pont entre la section encoders de la config sécurité et le UserService.

listUserStores#

function listUserStores(): string[]

Liste des backends utilisateur disponibles — alimente le champ available du statut user (écran Studio « Stores »). "memory" est mis EN TÊTE (baseline builtin, toujours disponible = le repli qui marche partout), les adapters ORM suivent triés. L’ordre est celui affiché dans la colonne « Backends dispo ».

mergeProfileIntoMetadata#

function mergeProfileIntoMetadata(metadata: unknown, patch: Partial<Record<ProfileField, string>>): Record<string, unknown>

Fusionne un patch validé dans la metadata existante en préservant les autres clés. Les champs de profil vidés ("") sont RETIRÉS (pas de clé fantôme). Rend la nouvelle metadata complète, prête pour updateOne({ metadata }).

missingUserColumns#

function missingUserColumns(present: Iterable<string>, expected?: readonly IUserColumn[]): readonly IUserColumn[]

Les colonnes du contrat qu’une définition d’entité ne rend PAS.

profileFromClaims#

function profileFromClaims(claims: Record<string, unknown>): Partial<Record<ProfileField, string>>

Pré-remplit un profil depuis des claims OIDC/OAuth (provisioning JIT d’un Shadow User social). Mappe les claims standard (given_name/family_name/ name/email/picture/locale, + avatar_url GitHub) vers IUserProfile, best-effort par champ : chaque valeur est validée isolément (bornes/format) et un claim invalide est ignoré sans bloquer les autres ni le login. Les claims viennent d’un tiers → lecture défensive.

projectProfile#

function projectProfile(metadata: unknown): IUserProfile

Projette la metadata brute d’une entité vers un IUserProfile — lecture par allowlist (seules les clés connues, typées string non vide). Garantit qu’aucune autre clé de metadata (applicative/sensible) n’entre dans le DTO.

projectProviderRoles#

function projectProviderRoles(metadata: unknown): Record<string, string[]>

Rôles gérés par CHAQUE fournisseur, lus dans metadata — pour l’affichage.

readProviderRoles#

function readProviderRoles(metadata: unknown, provider: string): string[]

Rôles que provider a accordés au dernier calcul, lus dans metadata.

reconcileProviderRoles#

function reconcileProviderRoles(current: readonly string[], previous: readonly string[], next: readonly string[]): IProviderRolesReconciliation

Recalcule l’ensemble effectif : rôles actuels − ceux que le fournisseur gérait, ∪ ceux qu’il accorde maintenant.

registerUserAdminApi#

function registerUserAdminApi(registry: IAdminRegistry, container: Container): void

Enregistre le producteur admin utilisateur sur le broker — idempotent. À appeler au onKernelBoot d’un module bootable qui dépend de @nodefony/user (typiquement @nodefony/security), @nodefony/user n’étant pas lui-même un module.

registerUserStore#

function registerUserStore(name: string): void

Déclare un backend de persistance utilisateur disponible (idempotent).

requestUser#

function requestUser(identifier: string): IUser | null

L’utilisateur DÉJÀ chargé pour la requête courante, s’il est bien celui qu’on cherche — sinon null, et l’appelant relit auprès du fournisseur.

toUserSummary#

function toUserSummary(user: IUser): IUserSummary

Projette un IUser en IUserSummary redacté. Fonction pure (cœur de la garantie anti-fuite, testée isolément) : currentRole/ socialProviders/timestamps sont lus défensivement (présents sur l’entité ORM, absents du contrat strict IUser) — password jamais lu ; de metadata, seules profile (allowlist) et providerRoles (des noms de rôles) passent.

truncatedPasswordHash#

function truncatedPasswordHash(plain: string): number

Les 4 premiers octets du SHA-1, en entier non signé.

validateProfilePatch#

function validateProfilePatch(input: unknown): { ok: true; value: Partial<Record<ProfileField, string>>; } | { ok: false; error: string; }

Valide + normalise un patch de profil reçu d’un client. Allowlist stricte : seules les clés PROFILE_FIELDS sont lues (anti-injection d’une clé metadata arbitraire). Chaque valeur est trimée ; une chaîne vide ou null = effacement du champ (matérialisé "", retiré au merge).

Constantes (12)#

DEFAULT_PASSWORD_POLICY#

const DEFAULT_PASSWORD_POLICY: Required<IPasswordPolicyOptions>

Défauts de la politique — source unique, relue par les tests.

PROVIDER_ROLES_KEY#

const PROVIDER_ROLES_KEY = "providerRoles"

Clé de metadata : { [fournisseur]: rôles accordés au dernier calcul }.

ROLE_ANONYMOUS#

const ROLE_ANONYMOUS = "ROLE_ANONYMOUS"

Rôle unique d’un utilisateur non authentifié.

USER_COLUMNS#

const USER_COLUMNS: readonly IUserColumn[]

USER_CREATED_EVENT#

const USER_CREATED_EVENT = "onUserCreated"

Événement kernel — un compte vient d’être créé (charge utile IUserCreatedEvent). Émis par UserService.create et attendu : @nodefony/security y retire les facteurs (TOTP, passkeys) laissés sous le même identifiant par un ancien titulaire, et une connexion immédiate ne doit pas les trouver encore là.

USER_DEFAULT_ORDER#

const USER_DEFAULT_ORDER: NonNullable<IPageQuery["order"]>

Ordre appliqué quand le client n’en demande aucun : par identifiant croissant — le seul champ toujours présent et unique, donc le seul qui rende une pagination offset déterministe sans départage supplémentaire.

USER_REVOKED_EVENT#

const USER_REVOKED_EVENT = "onUserRevoked"

Événement kernel — l’accès d’un compte doit être révoqué partout (suppression, désactivation, verrouillage, changement de mot de passe). Point d’extension : un module qui possède des artefacts liés à un compte (sessions, jetons, webhooks…) s’y abonne et nettoie LES SIENS — zéro couplage avec @nodefony/user. Émis par UserService seul, et attendu.

USER_SORTABLE_FIELDS#

const USER_SORTABLE_FIELDS: readonly [ "identifier", "enabled", "createdAt", "updatedAt", "id" ]

Le vocabulaire de tri des utilisateurs — source unique, en noms publics.

USER_SORTABLE_FIELDS_COMMON#

const USER_SORTABLE_FIELDS_COMMON: readonly [ "identifier", "enabled", "id" ]

Socle garanti par tous les backends d’utilisateurs. C’est ce sur quoi une interface peut compter sans savoir quelle base est branchée.

USER_SORTABLE_FIELDS_IN_MEMORY#

const USER_SORTABLE_FIELDS_IN_MEMORY: readonly [ "identifier", "enabled", "id" ]

Sous-ensemble réellement triable par l’annuaire en mémoire.

USER_TABLE_NAME#

const USER_TABLE_NAME = "User"

Le nom de la TABLE (ou collection) qui porte les utilisateurs.

anonymousUser#

const anonymousUser: AnonymousUser

Singleton d’AnonymousUser — instance partagée et gelée à réutiliser à chaque requête non authentifiée (zéro allocation dans le hot path).

Interfaces (26)#

Argon2idOptions#

interface Argon2idOptions

Paramètres de coût Argon2id (RFC 9106).

IBaseUserOptions#

interface IBaseUserOptions

Options de construction d’un BaseUser — signature en objet (lisibilité + extensibilité).

ICreateUserInput#

interface ICreateUserInput

Données d’entrée de création d’un utilisateur — le mot de passe est fourni en clair puis haché par UserService.createUser (jamais persisté tel quel).

IEncoderSpec#

interface IEncoderSpec

Spécification déclarative d’UN encodeur de mot de passe — miroir structurel de la section encoders du schéma Zod de @nodefony/security (qui valide bornes et défauts), SANS en dépendre : ce module reste la couche basse, l’inversion de dépendance est préservée (security consomme user, jamais l’inverse).

IOAuthProfile#

interface IOAuthProfile

Profil d’identité normalisé extrait d’un fournisseur OAuth/OIDC.

IOAuthProvisionPolicy#

interface IOAuthProvisionPolicy

Politique de provisioning décidée par l’appelant (config oauth2 de @nodefony/security) et transmise au provisioner — celui-ci ne lit aucune config, il applique ce qu’on lui passe (un provisioner applicatif peut ignorer ces valeurs et appliquer sa propre logique).

IOAuthUserProvisioner#

interface IOAuthUserProvisioner

Capability de provisioning d’un utilisateur OAuth — pattern Shadow User Just-In-Time.

IPasswordAuthenticatedUser#

interface IPasswordAuthenticatedUser extends IUser

Utilisateur porteur d’un credential mot de passe local — extension de IUser.

IPasswordBlocklist#

interface IPasswordBlocklist

Contrat de liste de blocage de mots de passe compromis (NIST SP 800-63B §5.1.1.2) — consulté à la CRÉATION et au CHANGEMENT de mot de passe, jamais au login (le hash stocké ne permet plus de juger le clair, et refuser un login existant verrouillerait l’utilisateur).

IPasswordEncoder#

interface IPasswordEncoder

Contrat d’un encodeur de mot de passe — abstraction de l’algorithme de hachage.

IPasswordPolicyOptions#

interface IPasswordPolicyOptions

Réglages d’une politique — tout est optionnel, les défauts sont sains.

IPasswordSubjectHint#

interface IPasswordSubjectHint

Ce qu’un appelant peut dire du compte visé — tout est optionnel.

IPasswordVerifier#

interface IPasswordVerifier

Contrat de vérification d’un credential mot de passe — le guichet auquel @nodefony/security présente un couple identifiant/mot de passe et qui répond par un verdict, jamais par un hash.

IProviderRolesReconciliation#

interface IProviderRolesReconciliation

Résultat d’un recalcul.

ISeedFailureContext#

interface ISeedFailureContext

Ce que l’appelant sait du semis, et que l’erreur ignore.

ISocialProvider#

interface ISocialProvider

Référence à un compte d’un fournisseur d’identité externe (OAuth / OIDC).

IUser#

interface IUser

Contrat strict d’un utilisateur Nodefony — surface minimale garantie au framework.

IUserColumn#

interface IUserColumn

Une colonne du contrat utilisateur : son nom, ce qu’elle contient, et qui la lit.

IUserCreatedEvent#

interface IUserCreatedEvent

Charge utile de USER_CREATED_EVENT.

IUserListQuery#

interface IUserListQuery extends IPageQuery

Requête de listing paginé d’utilisateurs — le contrat de page standard du core (IPageQuery) enrichi des filtres propres à l’utilisateur.

IUserProfile#

interface IUserProfile

Profil public d’un utilisateur — sous-ensemble des standard claims OpenID Connect (OIDC §5.1) en camelCase (convention Nodefony). Stocké dans BaseUser.metadata.profile, PAS dans des colonnes dédiées : IUser reste identité + rôles (le profil = donnée d’affichage anti-migration). Exposé par allowlist dans le DTO admin (IUserSummary.profile) — les autres clés de metadata (applicatives, potentiellement sensibles) ne fuitent jamais.

IUserProvider#

interface IUserProvider

Contrat de fourniture d’utilisateurs — la source d’identité (DB, LDAP, SSO…).

IUserRepository#

interface IUserRepository extends IRepository<IPasswordAuthenticatedUser>, ISortableSource

Repository spécialisé utilisateur — IRepository<IPasswordAuthenticatedUser> enrichi de finders métier.

IUserRevokedEvent#

interface IUserRevokedEvent

Charge utile de USER_REVOKED_EVENT. identifier = clé de jointure des artefacts (session user, PAT subjectId). tenantId = slot multi-tenant (toujours null en mono-tenant — réserve coût-0 pour une cascade scopée).

IUserRow#

interface IUserRow

Forme plate d’un utilisateur tel qu’un dépôt le rend, avant reconstruction en BaseUser — pendant TypeScript de USER_COLUMNS.

IUserSummary#

interface IUserSummary

Projection publique d’un utilisateur pour l’ADMINISTRATION (Studio, P6.15). Redaction PAR CONSTRUCTION (allowlist) — ne porte jamais password, jamais metadata (peut contenir du sensible), et les liens sociaux sont exposés sans jeton (provider/providerId/createdAt seulement).

Types (3)#

AuthFailureReason#

type AuthFailureReason = "unknown_identifier" | "disabled" | "locked" | "no_password" | "bad_credentials"

Raison d’un échec d’authentification (émise avec onAuthenticationFailure).

UserColumnOrigin#

type UserColumnOrigin = "identity" | "column" | "audit"

D’où vient la valeur d’une colonne — ce qui décide si un adaptateur doit la DÉCLARER ou peut la laisser au moteur.

UserColumnType#

type UserColumnType = "uuid" | "string" | "string[]" | "integer" | "boolean" | "object" | "object[]" | "date"

Type logique d’une colonne de l’utilisateur — ce que la donnée EST, jamais comment un moteur la range.


← Toutes les références d’API