Introduction

HttpInterceptors are use to handle and intercpts the HttpRequest and HttpResponse.
In this article we will try to use the HttpInterceptors for the following reasons,
  1. Creating an Error Interceptor.
  2. Creating JSON Web Tokens (JWT)interceptor.
  3. Creating a Fake-Backend Service with Interceptor.
Let’s create an application(called as Event Management) which will demonstrate the use of these Interceptors.
Application will have the following functionalities,
  1. Register of user
  2. Login
  3. Authentication of user
  4. Events list
  5. Paid (Members) event list.
  6. AuthGuard for routing.
Let’s create an application.
ng new AuthApp
Create below components with Angular CLI command,
  1. Register ( ng g c register )
  2. Login
  3. Logout
  4. Events
  5. Paid-events
Create folders
  1. _guards ( to keep the auth guard file )
  2. _helpers ( To keep the Interceptors )
  3. _model ( to keep the models )
  4. _services ( To keep the services )
  1. Create class user inside _model directory.
  2. export class User {
  3. id: number;
  4. username: string;
  5. password: string;
  6. firstName: string;
  7. lastName: string;
  8. isAdmin: boolean;
  9. token: string;
  10. }
Add auth.service.ts through command inside _services directory,
  1. import { Injectable } from '@angular/core';
  2. import { HttpClient } from '@angular/common/http';
  3. import { map } from 'rxjs/operators';
  4. import { Observable, BehaviorSubject } from 'rxjs';
  5. import { User } from '../_model/user';
  6. @Injectable({
  7. providedIn: 'root'
  8. })
  9. export class AuthService {
  10. private currentUserSubject: BehaviorSubject<User>;
  11. public currentUser: Observable<User>;
  12. private _loginUrl = "api/login";
  13. private _registerUrl = "api/register";
  14. constructor(private http: HttpClient) {
  15. this.currentUserSubject = new BehaviorSubject<User>(JSON.parse(sessionStorage.getItem('currentUser')));
  16. this.currentUser = this.currentUserSubject.asObservable();
  17. }
  18. public get currentUserValue(): User {
  19. return this.currentUserSubject.value;
  20. }
  21. getAuthToken(){
  22. return "TOKEN-001001010100111";
  23. }
  24. registerUser(user) {
  25. return this.http.post<any>(this._registerUrl, user);
  26. }
  27. login(user) {
  28. return this.http.post<any>(this._loginUrl, user);
  29. }
  30. authenticate(loginData) {
  31. return this.http.post<any>("http://localhost:4200/api/login", loginData)
  32. .pipe(map(user => {
  33. // login successful if there's a jwt token in the response
  34. if (user && user.token) {
  35. // store user details and jwt token in local storage to keep user logged in between page refreshes
  36. sessionStorage.setItem('currentUser', JSON.stringify(user));
  37. this.currentUserSubject.next(user);
  38. }
  39. return user;
  40. }));
  41. }
  42. logout() {
  43. // remove user from local storage to log user out
  44. sessionStorage.removeItem('currentUser');
  45. this.currentUserSubject.next(null);
  46. }
  47. }
Create event.service.ts through command inside _services directory,
  1. import { Injectable } from '@angular/core';
  2. import { HttpClient } from '@angular/common/http';
  3. @Injectable({
  4. providedIn: 'root'
  5. })
  6. export class EventService {
  7. private _eventsUrl = "api/events";
  8. private _paidEventsUrl = "api/paidEvents";
  9. constructor(private http: HttpClient) { }
  10. getEvents() {
  11. return this.http.get<any>(this._eventsUrl);
  12. }
  13. getPaidEvents() {
  14. return this.http.get<any>(this._paidEventsUrl);
  15. }
  16. }
Create file auth.guard.ts in _guard directory and add the below contents,
  1. import { Injectable } from '@angular/core';
  2. import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
  3. import { AuthService } from '../_services/auth.service';
  4. @Injectable({ providedIn: 'root' })
  5. export class AuthGuard implements CanActivate {
  6. constructor(
  7. private router: Router,
  8. private authenticationService: AuthService
  9. ) {}
  10. canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
  11. console.log("CanActivate method called from class AuthGuard..");
  12. const currentUser = this.authenticationService.currentUserValue;
  13. if (currentUser) {
  14. this.router.navigate(['/paidevents'], { queryParams: { returnUrl: state.url }});
  15. // authorised so return true
  16. return true;
  17. }
  18. // not logged in so redirect to login page with the return url
  19. this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});
  20. return false;
  21. }
  22. }
Create error.interceptors.ts in _helpers directory,
  1. import { Injectable } from '@angular/core';
  2. import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
  3. import { Observable, throwError } from 'rxjs';
  4. import { catchError } from 'rxjs/operators';
  5. import { AuthService } from '../_services/auth.service';
  6. import { Router } from '@angular/router';
  7. @Injectable()
  8. export class ErrorInterceptor implements HttpInterceptor {
  9. constructor(private authenticationService: AuthService, private router: Router) { }
  10. intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  11. return next.handle(request).pipe(catchError(err => {
  12. if (err.status === 401) {
  13. this.authenticationService.logout();
  14. this.router.navigate(['/login']);
  15. }
  16. const error = err.error.message || err.statusText;
  17. return throwError(error);
  18. }))
  19. }
  20. }
Create jwt.interceptor.ts in _helpers directory.
  1. import { Injectable } from '@angular/core';
  2. import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
  3. import { Observable } from 'rxjs';
  4. import { AuthService } from '../_services/auth.service';
  5. @Injectable()
  6. export class JwtInterceptor implements HttpInterceptor {
  7. constructor(private authenticationService: AuthService) { }
  8. intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  9. console.log("Intercept method called from JWTInterceptor..");
  10. // add authorization header with jwt token if available
  11. let currentUser = this.authenticationService.currentUserValue;
  12. if (currentUser && currentUser.token) {
  13. request = request.clone({
  14. setHeaders: {
  15. Authorization: `Bearer ${currentUser.token}`,
  16. admin: "Irshad",
  17. Host: "localhost://3400"
  18. }
  19. });
  20. }
  21. return next.handle(request);
  22. }
  23. }
Create fake-backend-intercepter.provider.ts in _helpers directory,
  1. import { Injectable } from '@angular/core';
  2. import { HttpRequest, HttpResponse, HttpHandler, HttpEvent, HttpInterceptor, HTTP_INTERCEPTORS } from '@angular/common/http';
  3. import { Observable, of, throwError } from 'rxjs';
  4. import { delay, mergeMap, materialize, dematerialize } from 'rxjs/operators';
  5. import * as jwt_decode from 'jwt-decode';
  6. // array in local storage for registered users
  7. let users = JSON.parse(localStorage.getItem('users')) || [];
  8. @Injectable()
  9. export class FakeBackendInterceptor implements HttpInterceptor {
  10. constructor(){}
  11. intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  12. // Token for admin user
  13. const adminToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEiLCJ1c2VybmFtZSI6ImFkbWluIiwiZmlyc3ROYW1lIjoiTW9oYW1tYWQiLCJsYXN0TmFtZSI6Iklyc2hhZCJ9.apXr_qMJrzvYczZbfW23UfJdzmMaaCA8d7Njm8tN9wI";
  14. // Token for non-admin users
  15. const userToken = "fake-jwt-token";
  16. const { url, method, headers, body } = request;
  17. return of(null)
  18. .pipe(mergeMap(handleRoute))
  19. .pipe(materialize())
  20. .pipe(delay(500))
  21. .pipe(dematerialize());
  22. function handleRoute() {
  23. switch (true) {
  24. case url.endsWith('/api/login') && method === 'POST':
  25. return authenticate();
  26. case url.endsWith('api/register') && method === 'POST':
  27. return register();
  28. case url.endsWith('/users') && method === 'GET':
  29. return getUsers();
  30. case url.endsWith('/events') && method === 'GET':
  31. return getEvents();
  32. case url.endsWith('/paidEvents') && method === 'GET':
  33. return getPaidEvents();
  34. case url.match(/\/users\/\d+$/) && method === 'DELETE':
  35. return deleteUser();
  36. default:
  37. return next.handle(request);
  38. }
  39. }
  40. function authenticate() {
  41. const { username, password } = body;
  42. if(username=='admin' && password=='1'){
  43. var admin = jwt_decode(adminToken);
  44. admin.isAdmin = true;
  45. admin.token = adminToken;
  46. return ok(admin);
  47. }
  48. const user = users.find(x => x.username === username && x.password === password);
  49. if (!user) return error('Username or password is incorrect');
  50. return ok({
  51. id: user.id,
  52. username: user.username,
  53. firstName: user.firstName,
  54. lastName: user.lastName,
  55. isAdmin: false,
  56. token: userToken
  57. })
  58. }
  59. function register() {
  60. const user = body
  61. if (users.find(x => x.username === user.username)) {
  62. return error('Username "' + user.username + '" is already taken');
  63. }
  64. user.id = users.length ? Math.max(...users.map(x => x.id)) + 1 : 1;
  65. user.isAdmin = false;
  66. users.push(user);
  67. localStorage.setItem('users', JSON.stringify(users));
  68. return ok('Successfully created');
  69. }
  70. function getUsers() {
  71. if (!isLoggedIn()) return unauthorized();
  72. return ok(users);
  73. }
  74. function deleteUser() {
  75. if (!isLoggedIn()) return unauthorized();
  76. users = users.filter(x => x.id !== idFromUrl());
  77. localStorage.setItem('users', JSON.stringify(users));
  78. return ok();
  79. }
  80. function ok(body?) {
  81. return of(new HttpResponse({ status: 200, body }))
  82. }
  83. function error(message) {
  84. return throwError({ error: { message } });
  85. }
  86. function unauthorized() {
  87. return throwError({ status: 401, error: { message: 'Unauthorised' } });
  88. }
  89. function isLoggedIn() {
  90. return headers.get('Authorization') === 'Bearer ' + userToken || headers.get('Authorization') === 'Bearer '+ adminToken;
  91. }
  92. function getEvents() {
  93. return ok(events);
  94. }
  95. function getPaidEvents() {
  96. if (!isLoggedIn()) return unauthorized();
  97. return ok(paidEvents);
  98. }
  99. function idFromUrl() {
  100. const urlParts = url.split('/');
  101. return parseInt(urlParts[urlParts.length - 1]);
  102. }
  103. }
  104. }
  105. let events = [
  106. {
  107. "id": "1",
  108. "name": "event1",
  109. "place": "place1",
  110. "date": "date1"
  111. },
  112. {
  113. "id": "2",
  114. "name": "event3",
  115. "place": "place2",
  116. "date": "date2"
  117. },
  118. {
  119. "id": "3",
  120. "name": "event3",
  121. "place": "place3",
  122. "date": "date3"
  123. },
  124. {
  125. "id": "4",
  126. "name": "event4",
  127. "place": "place4",
  128. "date": "date4"
  129. },
  130. {
  131. "id": "5",
  132. "name": "event5",
  133. "place": "place5",
  134. "date": "date5"
  135. }
  136. ];
  137. let paidEvents = [
  138. {
  139. "id": "1",
  140. "name": "paidEvent1",
  141. "place": "place1",
  142. "date": "date1"
  143. },
  144. {
  145. "id": "2",
  146. "name": "paidEvent3",
  147. "place": "place2",
  148. "date": "date2"
  149. },
  150. {
  151. "id": "3",
  152. "name": "paidEvent3",
  153. "place": "place3",
  154. "date": "date3"
  155. },
  156. {
  157. "id": "4",
  158. "name": "paidEvent4",
  159. "place": "place4",
  160. "date": "date4"
  161. },
  162. {
  163. "id": "5",
  164. "name": "paidEvent5",
  165. "place": "place5",
  166. "date": "date5"
  167. }
  168. ];
  169. export const fakeBackendProvider = {
  170. // use fake backend in place of Http service for backend-less development
  171. provide: HTTP_INTERCEPTORS,
  172. useClass: FakeBackendInterceptor,
  173. multi: true
  174. };
Create app-routing.module.ts
  1. import { NgModule } from '@angular/core';
  2. import { Routes, RouterModule } from '@angular/router';
  3. import { EventsComponent } from './events/events.component';
  4. import { PaidEventsComponent } from './paid-events/paid-events.component';
  5. import { LoginComponent } from './login/login.component';
  6. import { RegisterComponent } from './register/register.component';
  7. import { AuthGuard } from './_guards/auth.guard';
  8. const routes: Routes = [
  9. {
  10. path: '',
  11. component: EventsComponent,
  12. canActivate: [AuthGuard]
  13. },
  14. {
  15. path: 'events',
  16. component: EventsComponent,
  17. },
  18. {
  19. path: 'paidevents',
  20. component: PaidEventsComponent
  21. },
  22. {
  23. path: 'login',
  24. component: LoginComponent
  25. },
  26. {
  27. path: 'register',
  28. component: RegisterComponent
  29. }
  30. ];
  31. @NgModule({
  32. imports: [RouterModule.forRoot(routes)],
  33. exports: [RouterModule]
  34. })
  35. export class AppRoutingModule { }
Let’s start with component html and ts files.
Open login.component.ts and add the below contents,
  1. import { Component, OnInit } from '@angular/core';
  2. import { AuthService } from '../_services/auth.service';
  3. import { Router } from '@angular/router';
  4. @Component({
  5. selector: 'app-login',
  6. templateUrl: './login.component.html',
  7. styleUrls: ['./login.component.css']
  8. })
  9. export class LoginComponent implements OnInit {
  10. loginData = { username: '', password: ''};
  11. constructor(private _authservice: AuthService, private router: Router) {
  12. // redirect to paidEvents if already logged in
  13. if (this._authservice.currentUserValue) {
  14. this.router.navigate(['/paidevents']);
  15. }
  16. }
  17. ngOnInit(): void {
  18. }
  19. login() {
  20. console.log(this.loginData);
  21. this._authservice.authenticate(this.loginData).subscribe(
  22. data => {
  23. console.log("loggedin : ", data );
  24. this.router.navigate(['/paidevents'], { queryParams: { }});
  25. },
  26. error => {
  27. console.log("erorr: ", error);
  28. }
  29. );
  30. console.log('Logged in successfully!');
  31. }
  32. }
Open login.component.html and add the below contents,
  1. <div class="row pt-5">
  2. <div class="co-md-6 mx-auto">
  3. <div class="card rounded-0">
  4. <div class="card-header">
  5. <h3 class="mb-0">Login</h3>
  6. </div>
  7. <div class="card-body">
  8. <form class="form">
  9. <div class="form-group">
  10. <label for="">Username</label>
  11. <input [(ngModel)]="loginData.username" name="username" type="text" class="form-control rounded-0" required>
  12. </div>
  13. <div class="form-group">
  14. <label for="">Password</label>
  15. <input [(ngModel)]="loginData.password" name="password" type="text" class="form-control rounded-0" required>
  16. </div>
  17. <a routerLink="/register" class="btn btn-primary float-left">Register</a>
  18. <button (click)="login()" type="button" class="btn btn-primary float-right">Login</button>
  19. </form>
  20. </div>
  21. </div>
  22. </div>
  23. </div>
Open register.component.ts and add the below contents,
  1. import { Component, OnInit } from '@angular/core';
  2. import { AuthService } from '../_services/auth.service';
  3. import { User } from '../_model/user';
  4. import { Router } from '@angular/router';
  5. import { Subscription } from 'rxjs';
  6. @Component({
  7. selector: 'app-register',
  8. host: { '[@slideInOutAnimation]': '' },
  9. templateUrl: './register.component.html',
  10. styleUrls: ['./register.component.css']
  11. })
  12. export class RegisterComponent implements OnInit {
  13. component: any;
  14. subscription: Subscription;
  15. registerResult: number = 0;
  16. registerUserData = new User();
  17. constructor(private _authservice: AuthService, private router: Router) {
  18. // redirect to home if already logged in
  19. if (this._authservice.currentUserValue) {
  20. this.router.navigate(['/paidevents']);
  21. }
  22. }
  23. ngOnInit(): void {
  24. this.registerUserData.username
  25. = this.registerUserData.firstName
  26. = this.registerUserData.lastName
  27. = this.registerUserData.password
  28. = ""
  29. }
  30. Register(user){
  31. console.log(user);
  32. this._authservice.registerUser(user).subscribe(data=>
  33. {
  34. console.log("login Details:", data);
  35. this.router.navigate(['/login'], { queryParams: { }});
  36. },
  37. error => {
  38. console.log("Error: ", error);
  39. },
  40. ()=>{
  41. console.log("login process complete!");
  42. });
  43. console.log('Logged in!');
  44. }
  45. }
Open register.component.html and add the below contents,
  1. <div class="row pt-5">
  2. <div class="co-md-6 mx-auto">
  3. <div class="card rounded-0">
  4. <div class="card-header">
  5. <h3 class="mb-0">Register</h3>
  6. </div>
  7. <div class="card-body">
  8. <form class="form" #newUserForm="ngForm" (ngSubmit)="Register(newUserForm.value)">
  9. <div class="form-group">
  10. <label for="">Username</label>
  11. <input [(ngModel)]="registerUserData.username" name="username" type="text" class="form-control rounded-0" required>
  12. </div>
  13. <div class="form-group">
  14. <label for="">First Name</label>
  15. <input [(ngModel)]="registerUserData.firstName" name="firstName" type="text" class="form-control rounded-0" required>
  16. </div>
  17. <div class="form-group">
  18. <label for="">Last Name</label>
  19. <input [(ngModel)]="registerUserData.lastName" name="lastName" type="text" class="form-control rounded-0" required>
  20. </div>
  21. <div class="form-group">
  22. <label for="">Password</label>
  23. <input [(ngModel)]="registerUserData.password" name="password" type="password" class="form-control rounded-0" required>
  24. </div>
  25. <a routerLink="/login" class="btn btn-primary float-left">Login</a>
  26. <button type="submit" class="btn btn-primary float-right">Register</button>
  27. </form>
  28. </div>
  29. </div>
  30. </div>
  31. </div>
Open events.component.ts and add the below contents,
  1. import { Component, OnInit } from '@angular/core';
  2. import { EventService } from '../_services/event.service';
  3. @Component({
  4. selector: 'app-events',
  5. templateUrl: './events.component.html',
  6. styleUrls: ['./events.component.css']
  7. })
  8. export class EventsComponent implements OnInit {
  9. public events: any[];
  10. constructor(private _eventService: EventService) { }
  11. getAllEvents(){
  12. this._eventService.getEvents().subscribe(
  13. data => this.events = data,
  14. error => console.log('Error in getting event list ', error),
  15. () => {console.log('success to get event list...');
  16. });
  17. }
  18. ngOnInit(): void {
  19. this.getAllEvents();
  20. }
  21. }
Open events.component.html and add the below contents,
  1. <h2>Events Details:</h2>
  2. <table class="table">
  3. <thead>
  4. <tr><th>Id</th><th>Name</th><th>Place</th><th>Date</th></tr>
  5. </thead>
  6. <tbody>
  7. <tr *ngFor="let event of events, index as i">
  8. <td>{{event.id}}</td>
  9. <td>{{event.name}}</td>
  10. <td>{{event.place}}</td>
  11. <td>{{event.date}}</td>
  12. </tr>
  13. </tbody>
  14. </table>
Open paid-events.component.ts and add the below contents,
  1. import { Component, OnInit } from '@angular/core';
  2. import { AuthService } from '../_services/auth.service';
  3. import { EventService } from '../_services/event.service';
  4. @Component({
  5. selector: 'app-paid-events',
  6. templateUrl: './paid-events.component.html',
  7. styleUrls: ['./paid-events.component.css']
  8. })
  9. export class PaidEventsComponent implements OnInit {
  10. public events: any[];
  11. constructor(private _eventService: EventService) { }
  12. getAllEvents(){
  13. this._eventService.getPaidEvents().subscribe(
  14. data => this.events = data,
  15. error => console.log('Error in getting event list'),
  16. () => {console.log('success to get event list...');
  17. });
  18. }
  19. ngOnInit(): void {
  20. this.getAllEvents();
  21. }
  22. }
Open paid-events.component.html and add the below contents,
  1. <header></header>
  2. <hr>
  3. <table class="table">
  4. <thead>
  5. <tr><th>Id</th><th>Name</th><th>Place</th><th>Date</th></tr>
  6. </thead>
  7. <tbody>
  8. <tr *ngFor="let event of events, index as i">
  9. <td>{{event.id}}</td>
  10. <td>{{event.name}}</td>
  11. <td>{{event.place}}</td>
  12. <td>{{event.date}}</td>
  13. </tr>
  14. </tbody>
  15. </table>
Open app.module.ts and be sure that it contains the below contents,
  1. import { BrowserModule } from '@angular/platform-browser';
  2. import { NgModule } from '@angular/core';
  3. import { FormsModule } from '@angular/forms';
  4. import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
  5. import { AppRoutingModule } from './app-routing.module';
  6. import { AppComponent } from './app.component';
  7. import { RegisterComponent } from './register/register.component';
  8. import { LoginComponent } from './login/login.component';
  9. import { EventsComponent } from './events/events.component';
  10. import { PaidEventsComponent } from './paid-events/paid-events.component';
  11. import { fakeBackendProvider } from './_helpers/fake-backend-intercepter.provider';
  12. import { JwtInterceptor } from './_helpers/jwt.interceptor';
  13. import { ErrorInterceptor } from './_helpers/error.interceptor';
  14. import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
  15. import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
  16. @NgModule({
  17. declarations: [
  18. AppComponent,
  19. RegisterComponent,
  20. LoginComponent,
  21. EventsComponent,
  22. PaidEventsComponent
  23. ],
  24. imports: [
  25. BrowserModule,
  26. FormsModule,
  27. HttpClientModule,
  28. AppRoutingModule,
  29. BrowserAnimationsModule,
  30. NgbModule
  31. ],
  32. providers: [
  33. { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },
  34. { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
  35. fakeBackendProvider
  36. ],
  37. bootstrap: [AppComponent]
  38. })
  39. export class AppModule { }
Open app.component.ts and add the below contents,
  1. import { Component } from '@angular/core';
  2. import { AuthService } from './_services/auth.service';
  3. import { Router } from '@angular/router';
  4. @Component({
  5. selector: 'app-root',
  6. templateUrl: './app.component.html',
  7. styleUrls: ['./app.component.css']
  8. })
  9. export class AppComponent {
  10. constructor(private _authservice: AuthService, private router: Router){
  11. console.log(_authservice);
  12. }
  13. isLoggedIn(){
  14. return this._authservice.currentUserValue;
  15. }
  16. logout()
  17. {
  18. this._authservice.logout();
  19. this.router.navigate(['/login']);
  20. }
  21. title = 'AuthApp';
  22. }
Open app.component.html and add the below contents,
  1. <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
  2. <a class="navbar-brand" href="#">EMS</a>
  3. <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
  4. <span class="navbar-toggler-icon"></span>
  5. </button>
  6. <div class="collapse navbar-collapse" id="navbarSupportedContent">
  7. <ul class="navbar-nav mr-auto">
  8. <li class="nav-item active">
  9. <a class="nav-link" routerLink="/events" routerLinkActive="active">Events<span class="sr-only">(current)</span></a>
  10. </li>
  11. <li class="nav-item" *ngIf="isLoggedIn()">
  12. <a class="nav-link" routerLink="/paidevents" routerLinkActive="active">Members</a>
  13. </li>
  14. <li class="nav-item" *ngIf="!isLoggedIn()">
  15. <a class="nav-link" routerLink="/login" routerLinkActive="active">Login</a>
  16. </li>
  17. <li class="nav-item" *ngIf="!isLoggedIn()">
  18. <a class="nav-link" routerLink="/register" routerLinkActive="active">Register</a>
  19. </li>
  20. <li class="nav-item" *ngIf="isLoggedIn()" (click)="logout()">
  21. <a class="nav-link" routerLink="/register" routerLinkActive="active">Logout</a>
  22. </li>
  23. </ul>
  24. </div>
  25. </nav>
  26. <div class="container">
  27. <router-outlet></router-outlet>
  28. </div>
Your directory structure will be as below,
Interceptor In Angular
Run the application
Login with the register user (By default one user is already there user: ‘admin’ password : ‘1’)
Successful logged in user will be able to see the page Members (paid-event), otherwise Events page will be visible to all.
Click on Events menu
Click on Logout and you will be redirect to Login page.
Click on Register to register user,
We can see the Member menu only appears to the logged in user with the help of AuthGuard. You can check canActivate in app-routing.module.ts.
While working you can check the fake-backend-service provider to check for the HttpRequest for handling routes, Authenticate user, GetEvents/GetPaidEvents and other methods.
Interceptor jwt.interceptor is used to check the HttpRequest and will authenticate the user and handle the request with the logged in user with proper data and token information.
Error Interceptor will handle the request, catch the error and will be used to redirect and other operations that need to be performed.
Thank you.