<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Using_an_AuthInterceptor_Class</id>
	<title>Using an AuthInterceptor Class - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Using_an_AuthInterceptor_Class"/>
	<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Using_an_AuthInterceptor_Class&amp;action=history"/>
	<updated>2026-05-18T12:19:39Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Using_an_AuthInterceptor_Class&amp;diff=5030&amp;oldid=prev</id>
		<title>PeterHarding: Created page with &quot; =In app.module.ts=  &lt;pre&gt; ... import { HttpClientModule, HTTP_INTERCEPTORS } from &#039;@angular/common/http&#039;; ...    ],   providers: [     { provide: HTTP_INTERCEPTORS, useClass:...&quot;</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Using_an_AuthInterceptor_Class&amp;diff=5030&amp;oldid=prev"/>
		<updated>2019-10-24T00:08:56Z</updated>

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