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 { ApplicationConfigService } from '../config/application-config.service'; import { Login } from 'app/login/login.model'; type JwtToken = { id_token: string; }; @Injectable({ providedIn: 'root' }) export class AuthServerProvider { constructor( private http: HttpClient, private localStorageService: LocalStorageService, private sessionStorageService: SessionStorageService, private applicationConfigService: ApplicationConfigService ) {} getToken(): string { const tokenInLocalStorage: string | null = this.localStorageService.retrieve('authenticationToken'); const tokenInSessionStorage: string | null = this.sessionStorageService.retrieve('authenticationToken'); return tokenInLocalStorage ?? tokenInSessionStorage ?? ''; } login(credentials: Login): Observable { return this.http .post(this.applicationConfigService.getEndpointFor('api/authenticate'), credentials) .pipe(map(response => this.authenticateSuccess(response, credentials.rememberMe))); } logout(): Observable { return new Observable(observer => { this.localStorageService.clear('authenticationToken'); this.sessionStorageService.clear('authenticationToken'); this.localStorageService.clear('IsGoogle'); observer.complete(); }); } private authenticateSuccess(response: JwtToken, rememberMe: boolean): void { const jwt = response.id_token; if (rememberMe) { this.localStorageService.store('authenticationToken', jwt); this.sessionStorageService.clear('authenticationToken'); } else { this.sessionStorageService.store('authenticationToken', jwt); this.localStorageService.clear('authenticationToken'); } } }