Session
La session est résolue côté serveur. Elle est ensuite hydratée dans la page, injectée dans les handlers et transmise aux Fronds distantes.
useCurrentUser
const { user, refresh } = useCurrentUser();
// user: Ref<User | null> — résolu en SSR, hydraté avec la page : zéro requête en plus
// refresh: () => Promise<void> — relire après sign-in/out
<template>
<UButton v-if="user" :to="localePath('/blog/new')" :label="$t('nav.write')" />
<UButton v-else :to="localePath('/login')" :label="$t('nav.signIn')" />
</template>
La protection de route est un middleware Nuxt ordinaire qui lit la même session — Fougere n'ajoute pas de système de gardes parallèle.
La surface auth
auth: betterAuth({ … }) dans fougere.config.ts
(référence) monte better-auth sous
basePath — les endpoints que vos pages appellent directement :
await $fetch('/auth/sign-up/email', { method: 'POST', body: { name, email, password } });
await $fetch('/auth/sign-in/email', { method: 'POST', body: { email, password } });
await $fetch('/auth/sign-out', { method: 'POST', body: {} });
// puis : await refresh()
Votre entité User étend AuthUser — les champs better-auth plus les vôtres :
import { AuthUser } from '@fougere/auth-better';
import { oneOf, optional } from '@fougere/schema';
export default class User extends AuthUser.extend({
role: optional(oneOf('admin', 'editor', 'reader')),
}) {}
La sous-classe nommée compte : le scanner enregistre l'entité comme User, et la DI
matche user: User | null par ce nom.
Ne placez pas de pages sous le
basePathauth : le catch-all serveur utilise/auth/**. Ce site sert ses formulaires à/loginet/registerpour cette raison.
Une résolution, trois lecteurs
| Lecteur | Comment l'identité arrive |
|---|---|
| la page | hydratation — useCurrentUser(), zéro requête |
| un handler | state d'invocation → un Collector remplit user: User | null |
| une Frond distante | le state est transmis avec l'appel — ses collectors reçoivent le même user |
Le navigateur ne peut pas écrire ce state : il est construit côté serveur depuis le contexte de requête (Queries & commands).
Suite : invoke — appeler une opération côté serveur.