import { Injectable } from '@angular/core' ; import { HttpClient } from '@angular/common/http' ; import { Observable } from 'rxjs' ; import { map } from 'rxjs/operators' ; import { LocalStorageService , SessionStorageService } from 'ngx-webstorage' ; import { SERVER_API_URL } from 'app/app.constants' ; @ Injectable ( { providedIn : 'root' } ) export class AuthServerProvider { constructor ( private http , private $localStorage , private $sessionStorage ) { } getToken ( ) { return this . $localStorage . retrieve ( 'authenticationToken' ) || this . $sessionStorage . retrieve ( 'authenticationToken' ) ; } login ( credentials ) { const data = { username : credentials . username , password : credentials . password , rememberMe : credentials . rememberMe } ; return this . http . post ( SERVER_API_URL + 'api/authenticate' , data , { observe : 'response' } ) . pipe ( map ( authenticateSuccess . bind ( this ) ) ) ; function authenticateSuccess ( resp ) { const bearerToken = resp . headers . get ( 'Authorization' ) ; if ( bearerToken && bearerToken . slice ( 0 , 7 ) === 'Bearer ' ) { const jwt = bearerToken . slice ( 7 , bearerToken . length ) ; this . storeAuthenticationToken ( jwt , credentials . rememberMe ) ; return jwt ; } } } loginWithToken ( jwt , rememberMe ) { if ( jwt ) { this . storeAuthenticationToken ( jwt , rememberMe ) ; return Promise . resolve ( jwt ) ; } else { return Promise . reject ( 'auth-jwt-service Promise reject' ) ; } } storeAuthenticationToken ( jwt , rememberMe ) { if ( rememberMe ) { this . $localStorage . store ( 'authenticationToken' , jwt ) ; } else { this . $sessionStorage . store ( 'authenticationToken' , jwt ) ; } } logout ( ) { return new Observable ( observer => { this . $localStorage . clear ( 'authenticationToken' ) ; this . $sessionStorage . clear ( 'authenticationToken' ) ; observer . complete ( ) ; } ) ; } }