Server
Authentication & Authorization
Authentification & Autorisation
- Lib: Better Auth avec adapter Drizzle et plugin
admin. - Montée Hono: routes servies sous
/api/auth/**. - RBAC: rôles
useretadminvia plugin admin.
Fichiers & intégration
-
Server:
apps/server/src/lib/auth.ts— configuration Better Auth- Sessions (maxAge/updateAge), drizzle adapter, trustedOrigins
- Email reset via Resend (
sendEmail()) - OAuth Microsoft (
MICROSOFT_CLIENT_ID/SECRET/TENANT_ID)
apps/server/src/index.ts— montage des routes authapp.on(["POST","GET"], "/api/auth/**", (c) => auth.handler(c.req.raw))
apps/server/src/lib/context.ts— récupération session côté RPC
-
Web:
apps/web/src/lib/auth-client.ts—createAuthClient({ baseURL })- Important:
baseURLdoit pointer vers le chemin où le handler est monté.- Si le serveur monte sous
/api/auth/**, alors utiliserbaseURL = ${VITE_SERVER_URL}/api/auth.
- Si le serveur monte sous
Variables d'environnement (server)
CORS_ORIGIN— origine autorisée (ex:http://localhost:3001)BETTER_AUTH_SECRET— secret de chiffrement des sessionsBETTER_AUTH_URL— URL publique d'auth (ex:http://localhost:3000)RESEND_API_KEY,EMAIL_FROM— envoi d'emails (reset password)MICROSOFT_CLIENT_ID,MICROSOFT_CLIENT_SECRET,MICROSOFT_TENANT_ID— OAuth
Voir l'exemple : apps/server/.env-example.
Endpoints & baseURL
- Montage serveur:
app.on(["POST","GET"], "/api/auth/**", (c) => auth.handler(c.req.raw))dansapps/server/src/index.ts. - Cela implique que la racine d'auth est
/api/auth(ex:http://localhost:3000/api/auth). - Côté client Better Auth, définissez
baseURLvers cette racine:
// apps/web/src/lib/auth-client.ts
import { createAuthClient } from "better-auth/react";
import { getServerUrl } from "@/utils/runtime-env";
export const authClient = createAuthClient({
baseURL: `${getServerUrl()}/api/auth`, // IMPORTANT: refléter le montage serveur
});Sans ce suffixe /api/auth, le client appellera /sign-in/email au lieu de /api/auth/sign-in/email (404 probable). Adaptez selon votre proxy/ingress si vous réécrivez les chemins.
Cookies, CORS et sessions
- CORS (
hono/cors) est configuré aveccredentials: trueet une origine autorisée dynamique +CORS_ORIGIN. - Le client ORPC utilise
credentials: 'include'pour inclure les cookies. - Assurez-vous que:
- le front et le back partagent un domaine/port compatible avec
SameSite(en dev: ports différents OK sicredentials: true+ CORS). trustedOriginsdansauth.tsinclut l'origine front (process.env.CORS_ORIGIN).
- le front et le back partagent un domaine/port compatible avec
- Sessions:
maxAge: 86400,updateAge: 3600(config par défaut dansauth.ts).
Flux typiques
- Email + mot de passe
POST /api/auth/sign-in/emailavec email/password → cookie de session.- Reset password:
sendResetPasswordvia Resend; url générée par Better Auth.
- Microsoft OAuth
- Démarre le flow OAuth Microsoft → redirige vers callback Better Auth.
- Vérification côté client
- Les routes protégées appellent
getMe(ORPC) pour vérifier la session.
- Les routes protégées appellent
Débogage & erreurs courantes
- 404 sur
/sign-in/email: baseURL côté client ne pointe pas vers/api/auth. - 401
UNAUTHORIZED: pas de cookie de session (ou expiré); vérifiercredentials: 'include'. - 403
FORBIDDEN: rôle insuffisant (voir pluginadminet RBAC ORPC). - CORS: vérifier
CORS_ORIGINet l'origine exacte (schéma + host + port).
Accès protégé (ORPC)
- Middlewares dans
apps/server/src/lib/orpc.ts:protectedProcedure— nécessite session valideadminProcedure— nécessiterole === 'admin'- Erreurs standardisées:
UNAUTHORIZED,FORBIDDEN
Kalli