express-react-secured-boilerplate/
├── backend/
│ ├── controllers/ # Auth logic abstraction
│ ├── middleware/ # JWT middleware, guards
│ ├── models/ # MongoDB (Mongoose models)
│ ├── services/ # Separate memory-db logic
│ ├── routes/
│ │ ├── auth.js # auth routes
│ ├── index.js # Unified entry (Mongo or in-memory)
│ └── ...
└── frontend/
├── src/
│ ├── assets/
│ ├── components/ # UI and utility components (e.g. AccessGate)
│ ├── context/ # React Context (AccessProvider)
│ ├── pages/
│ └── services/ # Axios and API helpers
# Backend
cd backend
npm install
# Frontend
cd frontend
npm installPORT=5050
JWT_SECRET=your_secret_key
USE_MONGO=false
MONGO_URI=mongodb://localhost:27017/secure-auth
NODE_ENV=developmentSet USE_MONGO=true to enable MongoDB.
# Uses in-memory array for user storage
cd backend
node index.js# Requires Mongo running locally or remotely
USE_MONGO=true node index.jsAlternatively, set
USE_MONGO=truein your.env.
cd frontend
npm run dev- AccessProvider (React Context) manages global auth/access state (
hasAccess,loading, etc.) and refreshes access status on app load. - AccessGate (Component) wraps parts of the app to show a loading indicator while access status is being verified, preventing UI flickers or unauthorized content flashes.
- PrivateRoute component guards protected pages by checking
hasAccessand redirects unauthorized users. - All components consume
useAccess()hook to read and update access state.
| Method | Route | Description |
|---|---|---|
| POST | /register | Register new user |
| POST | /login | Login user (sets cookie) |
| POST | /logout | Clear auth cookie |
| Method | Route | Description |
|---|---|---|
| GET | /hasAccess | Checks if user is logged in |
Cookies are set as
HttpOnly,SameSite=Strict, and sent with all requests (withCredentials: true).
- ✅ Register → creates user
- ✅ Login → sets secure cookie
- ✅ Access protected route → verifies JWT & access
- ✅ Logout → clears session cookie
- Frontend: React + Vite + TailwindCSS
- Backend: Express.js + JWT Authentication
- Database: Optional MongoDB with Mongoose
- Security: Helmet, Rate Limiting, CORS configured
- Storage: JWT tokens stored in HttpOnly cookies
- Communication: Axios with credentials support
- Add input validation (frontend + backend)
- Add role-based access control
- Improve UI/UX with loading spinners and error states
- Refactor routes and modularize APIs further
If you see CORS or 403 errors, verify ports and proxy settings:
// vite.config.js
export default {
server: {
proxy: {
'/api': 'http://localhost:5050',
},
},
};Make sure your backend and frontend ports align with .env and config files.
MIT — free to use, remix, and build on.