I'm new to Angular and I'm working on a project which uses Angular 5 as frontend and Laravel5.5 as backend.
What I am trying to do: I'm doing token based authentication to check if the correct user is sending the request to backend and if the token is not authenticated it will throw an exception and the user will be redirected to login page.
What I did: I followed a tutorial on Youtube which uses Authguard to verify the user, Below is my Code.
auth.guard.ts
import {Injectable} from "@angular/core";
import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} from "@angular/router";
import {UserService} from "../_services/user.service";
import {Observable} from "rxjs/Rx";
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private _router: Router, private _userService: UserService) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
let currentUser = JSON.parse(localStorage.getItem('currentUser'));
console.log("AuthGuard.ts: "+ currentUser);
if (currentUser == null) {
this._router.navigate(['/login'], {queryParams: {returnUrl: state.url}});
return false;
}
else{
let response = this._userService.verify().map(
data => {
console.log("This is the data returned in authguard: "+data)
if (data !== null) {
// logged in so return true
// console.log("Not null");
return true;
}
// error when verify so redirect to login page with the return url
this._router.navigate(['/login'], {queryParams: {returnUrl: state.url}});
return false;
},
error => {
console.log('myerror');
// error when verify so redirect to login page with the return url
this._router.navigate(['/login'], {queryParams: {returnUrl: state.url}});
return false;
});
console.log("response : "+ typeof response);
return response;
}
}
}
In tutorial they used subscribe instead of map, but I did some research and it comes to me that we can not use subscribe with Observable.
My code though shows the error with subscribe and redirects the user to login page but with subscribe it does not return true or false so user is not redirected to next pages even if the credentials are correct.
Here is the code for verify function.
user.service.ts
import {Injectable} from "@angular/core";
import { HttpClient , HttpHeaders , HttpErrorResponse } from '@angular/common/http';
import {User} from "../_models/index";
import { Observable } from 'rxjs';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
interface DataResponse { status: string; }
@Injectable()
export class UserService {
constructor(private http: HttpClient) {
}
verify(): Observable<any> {
let currentUser = JSON.parse(localStorage.getItem('currentUser'));
let headers = new HttpHeaders({'Authorization': 'Bearer ' + currentUser.token});
let abc = this.http.get<DataResponse>('http://127.0.0.1:8000/api/auth/verify', {headers:headers}).map(response =>{
// console.log("hjsdgjd: "+response.status );
response
})
.catch(this.errorHandler);
console.log("abc: " + abc);
return abc;
}
errorHandler(error: HttpErrorResponse){
console.log('some thing');
return Observable.throw(error.message);
}
}
This is my console when I modify the token