47 lines
1.6 KiB
TypeScript
47 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(() => { });
|
||
|
}
|
||
|
|
||
|
}
|