authjs-implementation

activetype/docdomain/auth

TL;DR

Museum Ibu Marsinah auth file map (~/Project/lumendev-core). Reusable pattern: [[Resources/Tech/Auth.js/Auth.js Next.js JWT Google MongoDB adapter pattern]]. Operator detail: repo docs/utility/authentication.md, AGENTS.md.

Stack split

LayerFileRole
Edge-safe configsrc/auth.config.tsGoogle, JWT/session callbacks (id, role), trustHostno MongoDB
Full app authsrc/auth.tsAdapter + Credentials provider, OAuth role sync
Middlewaresrc/middleware.tsSelective public / vs /admin, POST /api/bookings

Unlike [[Projects/lumendev-invoice/context/authjs-implementation|Invoice]], the museum app does not lock the entire site — only admin and booking API.

Roles

  • ADMIN_EMAILS env → admin on sign-in (Google or credentials)
  • POST /api/auth/register → always user
  • JWT carries role for middleware (req.auth.user.role)

HTTP routes

PathImplementation
Auth catch-allsrc/app/api/auth/[...nextauth]/route.ts
Registersrc/app/api/auth/register/route.ts
Sign-in UIsrc/app/sign-in/page.tsx
Register UIsrc/app/daftar/page.tsx
Admin stubsrc/app/admin/page.tsx
Booking auth stubsrc/app/api/bookings/route.tsPOST → 501 after requireRole

Guards

  • src/lib/requireSession.tsrequireSession(), requireRole(roles)
  • Middleware enforces /admin and POST /api/bookings before handlers run

MongoDB

  • Adapter client: src/lib/mongodb-auth.ts
  • App users: src/models/User.ts on users collection (role, passwordHash)
  • Mongoose app data: src/lib/mongodb.ts

Related

  • Invoice map: [[Projects/lumendev-invoice/context/authjs-implementation]]
  • Changelog: [[Projects/lumendev-museum-ibu-marsinah/changelog/2026-05-21-auth-admin-user-roles]]