In this tutorial, we will learn how to build a full stack MERN JWT Authentication example: Login & Registration Application with React.js + Node.js Express + MongoDB. The back-end server uses Node.js Express with jsonwebtoken for JWT Authentication & Authorization, Mongoose for interacting with MongoDB database. The front-end will be created with React (with/without Redux), React Router, Axios. We’ll also use Bootstrap and perform Form validation.
Run both projects in one place:
How to integrate React with Node.js Express on same Server/Port
- JWT (JSON Web Token)
- React.js Node.js MongoDB Login & Registration example
- Flow for User Registration and User Login
- Back-end with Node.js & MongoDB
- Front-end with React, React Router
- Further Reading
JWT (JSON Web Token)
Comparing with Session-based Authentication that need to store Session on Cookie, the big advantage of Token-based Authentication is that we store the JSON Web Token (JWT) on Client side: Local Storage for Browser, Keychain for IOS and SharedPreferences for Android… So we don’t need to build another backend project that supports Native Apps or an additional Authentication module for Native App users.
There are three important parts of a JWT: Header, Payload, Signature. Together they are combined to a standard structure:
The Client typically attaches JWT in x-access-token header:
For more details, you can visit:
In-depth Introduction to JWT-JSON Web Token
React.js Node.js MongoDB Login & Registration example
It will be a full stack MERN Authentication, with Node.js Express for back-end and React.js for front-end. The access is verified by JWT Authentication.
- User can signup new account, login with username & password.
- Authorization by the role of the User (admin, moderator, user)
Let’s see the screenshots of our system:
– Anyone can access a public page before logging in:
– Registration – A new User can signup:
– Form validation will be like this:
– After signup is successful, User can signin on login Page:
– After login, App directs the User to Profile page:
– UI for Authorization login (the navigation bar will change by authorities):
– If a User who doesn’t have Admin role tries to access Admin/Moderator Board page:
Flow for User Registration and User Login
The diagram shows flow of User Registration, User Login and Authorization process.
There are 2 endpoints for authentication:
api/auth/signupfor User Registration
api/auth/signinfor User Login
If Client wants to send request to protected data/endpoints, it add legal JWT to HTTP x-access-token Header.
Back-end with Node.js & MongoDB
Our Node.js Express Application can be summarized in the diagram below:
Via Express routes, HTTP request that matches a route will be checked by CORS Middleware before coming to Security layer.
Security layer includes:
- JWT Authentication Middleware: verify SignUp, verify token
- Authorization Middleware: check User’s roles with record in MongoDB database
An error message will be sent as HTTP response to Client when the middlewares throw any error, .
Controllers interact with MongoDB Database via Mongoose library and send HTTP response (token, user information, data based on roles…) to Client.
- Express 4.17.1
- bcryptjs 2.4.3
- jsonwebtoken 8.5.1
- mongoose 5.9.1
This is directory structure for our Node.js Express & MongoDB application:
- configure MongoDB database connection
- configure Auth Key
- auth.routes.js: POST signup & signin
- user.routes.js: GET public & protected resources
- verifySignUp.js: check duplicate Username or Email
- authJwt.js: verify Token, check User roles in MongoDB database
- auth.controller.js: handle signup & signin actions
- user.controller.js: return public & protected content
– models for Mongoose Models
– server.js: import and initialize neccesary modules and routes, listen for connections.
You can find step by step to implement this Node.js App in the post:
Node.js + MongoDB: User Authentication & Authorization with JWT
Front-end with React, React Router
Let’s look at the diagram below.
App component is a container with React Router (
BrowserRouter). Basing on the state, the navbar can display its items.
Register components have form for data submission (with support of
react-validation library). They call methods from
auth.service to make login/register request.
auth.service methods use
axios to make HTTP requests. Its also store or get JWT from Browser Local Storage inside these methods.
Home component is public for all visitor.
Profile component displays user information after the login action is successful.
BoardAdmin components will be displayed by state
user.roles. In these components, we use
user.service to access protected resources from Web API.
auth-header() helper function to add JWT to HTTP header.
auth-header() returns an object containing the JWT of the currently logged in user from Local Storage.
If you want to use HttpOnly Cookie for storing JWT, please visit:
React.js Login & Registration example – JWT & HttpOnly Cookie
We’re gonna use these modules:
- React 16
- react-router-dom 5
- axios 0.19.2
- react-validation 3.0.7
- Bootstrap 4
- validator 12.2.0
This is folders & files structure for this React application:
With the explanation in diagram above, you can understand the project structure easily.
You can find step by step to implement this React App in the post:
React JWT Authentication (without Redux) example
Typescript version: React Typescript JWT Authentication (without Redux) example
Or Hooks + Redux:
React Hooks + Redux: JWT Authentication & Authorization example
Now we have an overview of MERN Authentication with JWT example by building Registration & Login Page using React.js, MongoDB, Node.js Express.
We also take a look at Node.js Express server architecture using jsonwebtoken & Mongoose, as well as React.js project structure for building a front-end app working with JWT.
This React Client also works well with back-end in the post:
– Node.js + MySQL: User Authentication & Authorization with JWT
– Node.js + PostgreSQL: User Authentication & Authorization with JWT
You will want to know how to run both projects in one place:
How to integrate React with Node.js Express on same Server/Port
This Node.js server also works well with front-end in the post:
– React Typescript: JWT Authentication (without Redux) example
– React Redux: JWT Authentication & Authorization example
– React Hooks: JWT Authentication (without Redux) example
– React Hooks + Redux: JWT Authentication & Authorization example
Happy learning, see you again!
- React Component
- In-depth Introduction to JWT-JSON Web Token