Loading...
Loading...
Use when adding authentication (login, logout, protected routes) to Fastify web applications - integrates @auth0/auth0-fastify for session-based auth. For stateless Fastify APIs use auth0-fastify-api instead.
npx skill4agent add auth0/agent-skills auth0-fastifyauth0-quickstartauth0-reactauth0-vueauth0-angularauth0-nextjsauth0-react-native@auth0/auth0-fastify-apinpm install @auth0/auth0-fastify fastify @fastify/view ejs dotenv.envAUTH0_DOMAIN=your-tenant.auth0.com
AUTH0_CLIENT_ID=your-client-id
AUTH0_CLIENT_SECRET=your-client-secret
SESSION_SECRET=<openssl-rand-hex-64>
APP_BASE_URL=http://localhost:3000openssl rand -hex 64server.jsimport 'dotenv/config';
import Fastify from 'fastify';
import fastifyAuth0 from '@auth0/auth0-fastify';
import fastifyView from '@fastify/view';
import ejs from 'ejs';
const fastify = Fastify({ logger: true });
// Register view engine
await fastify.register(fastifyView, {
engine: { ejs },
root: './views',
});
// Configure Auth0 plugin
await fastify.register(fastifyAuth0, {
domain: process.env.AUTH0_DOMAIN,
clientId: process.env.AUTH0_CLIENT_ID,
clientSecret: process.env.AUTH0_CLIENT_SECRET,
appBaseUrl: process.env.APP_BASE_URL,
sessionSecret: process.env.SESSION_SECRET,
});
fastify.listen({ port: 3000 });/auth/login/auth/logout/auth/callback// Public route
fastify.get('/', async (request, reply) => {
const session = await fastify.auth0Client.getSession({ request, reply });
return reply.view('views/home.ejs', {
isAuthenticated: !!session,
});
});
// Protected route
fastify.get('/profile', {
preHandler: async (request, reply) => {
const session = await fastify.auth0Client.getSession({ request, reply });
if (!session) {
return reply.redirect('/auth/login');
}
}
}, async (request, reply) => {
const user = await fastify.auth0Client.getUser({ request, reply });
return reply.view('views/profile.ejs', { user });
});node server.jshttp://localhost:3000| Mistake | Fix |
|---|---|
| Forgot to add callback URL in Auth0 Dashboard | Add |
| Missing or weak SESSION_SECRET | Generate secure 64-char secret with |
| App created as SPA type in Auth0 | Must be Regular Web Application type for server-side auth |
| Session secret exposed in code | Always use environment variables, never hardcode secrets |
| Wrong appBaseUrl for production | Update APP_BASE_URL to match your production domain |
| Not awaiting fastify.register | Fastify v4+ requires awaiting plugin registration |
auth0-quickstartauth0-migrationauth0-mfadomainclientIdclientSecretappBaseUrlsessionSecretaudiencefastify.auth0Client.getSession({ request, reply })fastify.auth0Client.getUser({ request, reply })fastify.auth0Client.getAccessToken({ request, reply })fastify.auth0Client.logout(options, { request, reply })preHandler!!sessiongetUser({ request, reply })getAccessToken({ request, reply })