Как я могу проверить функцию canActivate для angular, которая возвращает функцию, которая, в свою очередь, возвращает логическое значение?.
Authgurad.ts: import {Injectable, OnInit, EventEmitter, Output, Directive} from ' @ angular / core '; импортировать {CanActivate, ActivatedRouteSnapshot, Router, RouterStateSnapshot} из '@ angular / router'; import {Observable} из 'rx js'; импортировать {среду} из '../../environments/environment'; импортировать {HttpService} из '../services/http.service'; import {OAuthService} из 'angular -oauth2-oid c'; импортировать {OAuth2OdicService} из '../services/oauth2-odic.service'; импортировать {SessionStorageService} из '../services/session.storage.service';
@Directive({
selector: '[AuthGuard]',
host: {},
providers: []
})
@Injectable()
export class AuthGuard implements CanActivate {
public accessToken: string;
@Output() valueChange = new EventEmitter();
constructor(
private sessionStorageService: SessionStorageService,
private oauthService: OAuth2OdicService,
private router: Router,
private httpService: HttpService) {
}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot) {
return new Promise<boolean>((resolve, reject) => {
const canAuthenticate = (route.fragment !== null && !!route.fragment);
if (!canAuthenticate && !sessionStorage.getItem('id_token')) {
this.login();
reject(false);
} else {
const accessToken = this.getQueryParam(route.fragment, 'access_token');
const idToken = this.getQueryParam(route.fragment, 'id_token');
const tokenType = this.getQueryParam(route.fragment, 'token_type');
if (accessToken && idToken && tokenType) {
this.sessionStorageService.setItem('id_token', idToken);
this.sessionStorageService.setItem('access_token', accessToken);
this.sessionStorageService.setItem('token_type', tokenType);
resolve(true);
this.router.navigate(['/search']);
} else {
if (sessionStorage.getItem('access_token') && sessionStorage.getItem('id_token')) {
resolve(true);
this.router.navigate(['/search']);
}
}
}
});
}
private login() {
this.httpService.getConfigurations().subscribe(data => {
const redirectUri = window.location.origin;
const clientId = data.clientId;
const loginUrl = data.authenticationUrl ;
const accessToken = this.oauthService.initImplicitFlow(loginUrl + '?', clientId, redirectUri + '/');
});
}
private getQueryParam(queryString: string, paramName: string) {
if (queryString && paramName) {
const expression = new RegExp(`${paramName}=([^&]*)`);
const results = queryString.match(expression);
return results[1] ? results[1] : '';
}
}
}