I need to check te back-end for authentication status, however te code completes before te observable return is finished. Which would result in an undifined.
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
this.isAuthenticated();
return this.authenticated;
}
isAuthenticated(){
this.loginService.isAuthenticated()
.subscribe(status => this.authenticated = status)
}
How would i change this code so i wait for the observable to complete to get the authenticated status before the code returns.
Note: the Angular canActivate method does not allow me to write the code as shown below:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
this.loginService.isAuthenticated()
.subscribe(status => {
this.authenticated = status;
return this.authenticated;
});
}
This results in the followin error:
Class 'AuthGuard' incorrectly implements interface 'CanActivate'.
Types of property 'canActivate' are incompatible. Type '(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => void' is not assignable to type '(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => boolean | Observable | Pr...'. Type 'void' is not assignable to type 'boolean | Observable | Promise'.
A suggestion for a solution for this error would also be helpful.
Solved the issue with async / await and promise
The LoginService first import toPromise:
import 'rxjs/add/operator/toPromise';
Then created an async method in the LoginService
async isAuthenticated(){
const response = await this.http.get('/login/authenticated').toPromise();
return response.json();
}
Then in the component:
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
this.loginStatus = await this.loginService.isAuthenticated();
console.log("LOGGED IN STATUS: " + this.loginStatus);
if (this.loginStatus == true){
return true;
}
// not logged in so redirect to login page with the return url
this.router.navigate(['/layout/login'], { queryParams: { returnUrl: state.url } });
}
You can return the observable as Observable<boolean>
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.loginService.isAuthenticated()
.map(status => {
console.log(status);
this.authenticated = status;
return true;
}).catch((err) => {
console.log(err);
return Observable.of(false);
});
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With