Nitro et le pattern BFF
Nuxt embarque un vrai serveur
Le dossier server/ est un backend complet (Nitro) : routes API par convention de fichiers, middlewares, accĂšs aux secrets â qui ne quittent jamais le serveur :
// server/api/learn/[...path].ts (le VRAI fichier de cette plateforme)
export default defineEventHandler(async (event) => {
const client = event.context.logtoClient // session posée par le middleware
const token = await client?.getAccessToken(RESOURCE) // le JWT, cÎté serveur SEULEMENT
if (!token) throw createError({ statusCode: 401 })
return proxyRequest(event, `${config.learnApiUrl}/v1/${path}`, {
headers: { authorization: `Bearer ${token}` },
})
})
Le pattern BFF (Backend For Frontend)
Le navigateur ne parle jamais directement Ă l'API mĂ©tier â il parle au serveur Nuxt, qui proxifie :
navigateur ââcookie httpOnlyââ> Nitro (session, secrets, token) ââBearer JWTââ> API mĂ©tier
Les quatre gains, tous mesurables :
- sĂ©curitĂ© : le token JWT n'existe que cĂŽtĂ© serveur â pas de token en localStorage Ă voler (XSS), un cookie httpOnly que JS ne peut pas lire ;
- pas de CORS : le navigateur ne voit qu'une seule origine ;
- façade adaptée : le BFF peut agréger/adapter les appels pour SON front ;
- secrets serveur : clĂ©s d'API, secrets Logto â dans le runtime Nitro, jamais dans le bundle client.
C'est le pattern des deux projets que tu connais : cette plateforme (Nitro â learn-api Rust) et le copilot (Nitro â FastAPI). Quand tu vois runtimeConfig sans prĂ©fixe public, c'est du secret serveur ; avec public., c'est embarquĂ© dans le bundle â la frontiĂšre la plus importante du fichier de config.
Les usages au-delĂ du proxy
Routes server = tout ce qui doit ĂȘtre fait prĂšs du serveur : gĂ©rer la session (le middleware Logto), servir un sitemap, recevoir un webhook, cacher une rĂ©ponse (cachedEventHandler)⊠Nitro se dĂ©ploie partout (node, serverless, edge) â c'est lui le node .output/server/index.mjs de nos Dockerfiles.
Le gain de sécurité principal du BFF :