import { Injectable } from '@angular/core'; import { CanActivate, GuardResult, MaybeAsync, RedirectCommand, 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((publish) => { this.oidcSecurityService.checkAuth().subscribe(({ isAuthenticated }) => { publish.next(isAuthenticated ? true : new RedirectCommand(this.router.parseUrl('/'))); }); }); } login() { this.oidcSecurityService.authorize(); } logout() { this.oidcSecurityService.logoff().subscribe(() => { }); } }