46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
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<UserData | undefined>;
|
|
|
|
constructor(
|
|
private readonly oidcSecurityService: OidcSecurityService,
|
|
protected apiConfig: Configuration,
|
|
private router: Router
|
|
) {
|
|
this.$user = new BehaviorSubject<UserData | undefined>(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<GuardResult> {
|
|
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(() => { });
|
|
}
|
|
|
|
}
|