In this tutorial, we will learn how to build a full stack Node.js Express + Angular 12 JWT Authentication (Login, Registration) and Role based Authorization example. The back-end server uses Node.js Express with jsonwebtoken for Rest APIs, Sequelize for interacting with MySQL database. The front-end will be created with Angular 12, HttpInterceptor and Router. We’ll also perform Form validation on UI.
MEAN stack instead:
Angular 12 + Node + MongoDB: Login and Registration example
Related Posts:
– Node.js + MongoDB: User Authentication & Authorization with JWT
– Node.js + PostgreSQL: JWT Authentication & Authorization
Fullstack:
– Angular + Node.js Express + MySQL example
– Angular + Node.js Express + PostgreSQL example
– Angular + Node.js Express + MongoDB example
– Angular + Node.js Express: File Upload example
Run both projects in one place:
How to Integrate Angular with Node.js Restful Services
Newer version:
– Node.js Express, Angular 13: JWT Authentication & Authorization example
– Node.js Express, Angular 14: JWT Authentication & Authorization example
– Node.js Express, Angular 15: JWT Authentication & Authorization example
Contents
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: header.payload.signature
.
The Client typically attaches JWT in x-access-token header:
x-access-token: [header].[payload].[signature]
For more details, you can visit:
In-depth Introduction to JWT-JSON Web Token
Node.js Express Angular 12 Authentication example
It will be a full stack, with Node.js Express for back-end and Angular 12 for front-end. The access is verified by JWT Authentication.
- User can signup new account (registration), login with username & password.
- Role based Authorization (admin, moderator, user)
Screenshots
The images below shows screenshots of our Angular 12 Client App.
– Anyone can access a public page before logging in:
– A new User can signup:
– Registration form validation:
More details about Form Validation at:
Angular 12 Form Validation example (Reactive Forms)
– Login with legal account:
– Profile page:
– UI for admin role:
– If a User who doesn’t have Admin role tries to access Admin/Moderator Board page:
Demo
This is full Angular + Node.js Express JWT Authentication & Authorization App Demo (with form validation, check signup username/email duplicates, test authorization with 3 roles: Admin, Moderator, User).
In the video, we use Angular 10, but the logic and UI are the same as this Angular version 12.
Flow for User Registration and User Login
The diagram shows flow of User Registration, User Login and Authorization process.
We have 2 endpoints for authentication:
api/auth/signup
for User Registrationapi/auth/signin
for User Login
A legal JWT must be added to HTTP x-access-token Header if Client accesses protected resources.
Back-end with Node.js Express & Sequelize
Overview
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 database
If these middlewares throw any error, a message will be sent as HTTP response.
Controllers interact with MySQL Database via Sequelize and send HTTP response (token, user information, data based on roles…) to client.
Technology
- Express 4
- bcryptjs 2.4.3
- jsonwebtoken 8.5.1
- Sequelize 5.21.3
- MySQL/PostgreSQL
Project Structure
This is directory structure for our Node.js Express application:
– config
- configure MySQL database & Sequelize
- configure Auth Key
– routes
- auth.routes.js: POST signup & signin
- user.routes.js: GET public & protected resources
– middlewares
- verifySignUp.js: check duplicate Username or Email
- authJwt.js: verify Token, check User roles in database
– controllers
- auth.controller.js: handle signup & signin actions
- user.controller.js: return public & protected content
– models for Sequelize Models
- user.model.js
- role.model.js
– server.js: import and initialize neccesary modules and routes, listen for connections.
Implementation
You can find step by step to implement this Node.js App in the post (with Github):
Node.js – JWT Authentication & Authorization example
Or you can use PostgreSQL/MongoDB database instead:
– Node.js + PostgreSQL: JWT Authentication & Authorization
– Node.js + MongoDB: JWT Authentication & Authorization example
Front-end with Angular 12, HttpInterceptor and Router
Overview
Our Angular App can be summarized in component diagram below:
– The App
component is a container using Router
. It gets user token & user information from Browser Session Storage via token-storage.service
. Then the navbar now can display based on the user login state & roles.
– Login
& Register
components have form for submission data (with support of Form Validation). They use token-storage.service
for checking state and auth.service
for sending signin/signup requests.
– auth.service
uses Angular HttpClient ($http
service) to make authentication requests.
– every HTTP request by $http
service will be inspected and transformed before being sent by auth-interceptor
.
– Home
component is public for all visitor.
– Profile
component get user
data from Session Storage.
– BoardUser
, BoardModerator
, BoardAdmin
components will be displayed depending on roles
from Session Storage. In these components, we use user.service
to get protected resources from API.
Technology
– Angular 12
– RxJS 6
– Bootstrap 4
Project Structure
The structure of Angular 12 project is simple:
Because I’ve shown component diagram, you can understand it properly without any explanation.
Implementation
You can find step by step to implement this Angular App (with Github) in the post:
Angular 12 JWT Authentication example with Web Api
Other versions:
– Angular 8 JWT Authentication example with Web Api
– Angular 10 JWT Authentication example with Web Api
– Angular 11 JWT Authentication example with Web Api
– Angular 13 JWT Authentication example with Web Api
– Angular 14 JWT Authentication example with Web Api
– Angular 15 JWT Authentication example with Web Api
Further Reading
- https://sequelize.org/v5/
- https://www.npmjs.com/package/jsonwebtoken
- Angular HttpInterceptor
- In-depth Introduction to JWT-JSON Web Token
Newer versions:
– Node.js Express, Angular 13: JWT Authentication & Authorization example
– Node.js Express, Angular 14: JWT Authentication & Authorization example
– Node.js Express, Angular 15: JWT Authentication & Authorization example
Fullstack:
– Angular + Node.js Express + MySQL example
– Angular + Node.js Express + PostgreSQL example
– Angular + Node.js Express + MongoDB example
– Angular + Node.js Express: File Upload example
Source Code
The complete source code for this tutorial can be found at Angular Node Express Github.
Conclusion
Now we have an overview of Node.js Express + Angular 12 Authentication and Authorization example using JWT, HttpInterceptor, Router, Form Validation along with flow for registration and login actions.
We also take a look at Node.js Express server architecture for JWT Authentication using jsonwebtoken & Sequelize, as well as Angular project structure for building a front-end app working with JWT.
Next tutorials will show you more details about how to implement this interesting system:
– Back-end:
– Front-end:
This Angular Client also works well with back-end in the post:
– Node.js + MongoDB: User Authentication & Authorization with JWT
– Node.js + PostgreSQL: JWT Authentication & Authorization
You will want to know how to run both projects in one place:
How to Integrate Angular with Node.js Restful Services
Happy learning, see you again!
Thank you for the node.js and angular blog because that was very help full for me and in your post you also put the diagram that part was very great and keep sharing more posts like this.
Great thanks for these excellent tutorials! Having succeeded with the combo: Express/PostgreSQL together with your Angular12 frontend on a local machine, I find myself struggling with CORS exceptions with a domain on a Debian/Nginx server. Exceptions such as ‘Cannot connect to wss://[myexample][dot]com/ws; due to …policy’. If one was using [https] ://myexample[dot]com, would you have any suggestions or a solution with regard to these exception?
You’re the best!!!
Thank you so much for this Angular and Node tutorial. It was very helpful for me!