import { Injectable } from '@angular/core'; import { CanActivate, GuardResult, MaybeAsync, Router } from '@angular/router'; import UserData from '@core/auth/UserData'; import { Configuration } from '@core/server'; import { OidcSecurityService } from 'angular-auth-oidc-client'; import { BehaviorSubject, Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class AuthService implements CanActivate { public $user: BehaviorSubject; constructor( private readonly oidcSecurityService: OidcSecurityService, protected apiConfig: Configuration, private router: Router ) { this.$user = new BehaviorSubject(undefined); this.oidcSecurityService.checkAuth().subscribe(({ isAuthenticated, userData, accessToken }) => { apiConfig.credentials = {JWTAuth: accessToken}; const isLoggedIn = isAuthenticated && userData != null && accessToken != ''; this.$user.next(isLoggedIn ? { username: userData.preferred_username, verified: userData.email_verified } : undefined); }); } canActivate(): MaybeAsync { return new Observable(() => { this.oidcSecurityService.checkAuth().subscribe(({ isAuthenticated }) => { if (isAuthenticated) { return true; } this.login(); return false; }); }); } login() { this.oidcSecurityService.authorize(); } logout() { this.oidcSecurityService.logoff().subscribe(() => { }); } }