Full-stack MERN authentication project with a user-facing client, an admin dashboard, and a Node/Express API. The API uses JWT access/refresh tokens, email verification, and role-based admin endpoints.
server: Express + MongoDB API (JWT auth, refresh tokens, user management)client: React (Vite) user-facing web appadmin: React (Vite) admin dashboard
- Node.js + npm
- MongoDB instance (local or Atlas)
Required:
BUILD_MODE=development
MONGO_URI=mongodb+srv://USER:PASSWORD@cluster/db
MONGO_DB_NAME=mern_users_auth
JWT_ACCESS_SECRET=your_access_secret
JWT_REFRESH_SECRET=your_refresh_secret
ACCESS_TOKEN_EXPIRE=15m
REFRESH_TOKEN_EXPIRE=7d
Optional (recommended for local dev):
PORT=8080
LOCAL_DEV_PORT=5000
LOCAL_DEV_HOST=localhost
CORS_ORIGINS=http://localhost:5173,http://localhost:5174
SERVER_URL=http://localhost:5000
CLIENT_URL=http://localhost:5173
ADMIN_URL=http://localhost:5174
EMAIL_HOST=smtp.example.com
EMAIL_PORT=587
EMAIL_USER=your_email
EMAIL_PASS=your_email_password
AUTHOR=your_name
Notes:
- In development, the server uses
LOCAL_DEV_PORT(defaults to5000). In production it usesPORT. CORS_ORIGINSis a comma-separated list.
VITE_API_URL=http://localhost:5000/api
Defaults to http://localhost:5000/api if not set.
VITE_API_URL=http://localhost:5000/api
Defaults to http://localhost:5000/api if not set.
Run these in separate terminals:
cd server && npm install
cd ../client && npm install
cd ../admin && npm install
cd server && npm run dev
cd client && npm run dev
cd admin && npm run dev
Default local ports:
- API:
http://localhost:5000/api - Client:
http://localhost:5173 - Admin:
http://localhost:5174
npm run dev- start with nodemonnpm start- start with node
npm run dev- start Vite dev servernpm run build- production buildnpm run preview- preview buildnpm run lint- lint
Base path: /api
Auth:
POST /auth/registerGET /auth/verify-emailPOST /auth/loginPOST /auth/refresh-tokenDELETE /auth/logout
Client:
GET /user-profile(auth required)
Admin:
GET /admin/dashboard(admin + staff)GET /admin/users(admin + staff)POST /admin/users(admin only)PATCH /admin/users/:id(admin only)DELETE /admin/users/:id(admin only)PATCH /admin/users/:id/lock(admin only)
- The server mounts routes under
/api. - The admin dashboard redirect uses
ADMIN_URL.