Using an AuthInterceptor Class
Jump to navigation
Jump to search
In app.module.ts
...
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
...
],
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },
],
Sample AuthInterceptor Class
In auth-interceptor.ts
import { Injectable } from '@angular/core';
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';
import { JwtHelperService } from '@auth0/angular-jwt';
import { environment } from '../environments/environment';
import * as moment from 'moment';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
apiUser = 'xxx@xxx.xxx';
apiPassword = 'xxxx';
apiUrlBase = environment.baseUrl;
// -------------------------------------------------------------------------
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// tslint:disable-next-line: max-line-length
let token = localStorage.token;
// let token = '..';
// ; // you probably want to store it in localStorage or something
const now = new Date();
const dateStringWithTime = moment(now).format('YYYY-MM-DD HH:mm:ss');
console.log('[intercept] now |' + now + '|');
const helper = new JwtHelperService();
const decodedToken = helper.decodeToken(token);
console.log('[intercept] decodedToken |' + decodedToken + '|');
const expirationDate = helper.getTokenExpirationDate(token);
const expirationTimestamp = moment(now).format('YYYY-MM-DD HH:mm:ss');
console.log('[intercept] expirationTimestamp |' + expirationTimestamp + '|');
const isExpired = helper.isTokenExpired(token);
console.log('[intercept] isExpired |' + isExpired + '|');
if (isExpired) { // Need to get a new token
token = this.getApiBearerToken();
console.log('[intercept] newToken |' + token + '|');
localStorage.setItem ('token', token);
}
if (!token) {
return next.handle(req);
}
const req1 = req.clone({
headers: req.headers.set('Authorization', `Bearer ${token}`)
});
return next.handle(req1);
}
// -----------------------------------------------------------------------
genarateBasicAuthHash(user: string, password: string)
{
const token = user + ':' + password;
// Should i be encoding this value????? does it matter???
// Base64 Encoding -> btoa
const hash = btoa(token);
return 'Basic ' + hash;
}
// -----------------------------------------------------------------------
getApiBearerToken() {
console.log('[app.service::getApiBearerToken]');
const basicAuthHash = this.genarateBasicAuthHash(this.apiUser, this.apiPassword);
const uri = this.apiUrlBase + '/auth';
console.log('[getApiBearerToken] uri |' + uri + '|');
const request = new XMLHttpRequest();
request.open('POST', uri, false);
request.setRequestHeader('Authorization', basicAuthHash);
request.send();
// View request status
// alert(request.status);
console.log('[getApiBearerToken] |' + request.responseText + '|');
const json = JSON.parse(request.responseText);
const newToken = json.token;
console.log('[getApiBearerToken] |' + newToken + '|');
// return this._http.get(uri).pipe(map(res => res.json()), catchError(this.handleError));
return newToken;
} // getApiBearerToken
// -------------------------------------------------------------------------
}
Problem is XMLHttpRequest() call runs in main thread - needs to be run in a background thread.