当用户第一次使用他们的凭据登录时,auth guard 允许用户访问管理页面,但是一旦我刷新或转到另一个管理页面,auth guard 会将我重定向回客户端页面,说明我没有访问权限.
auth.guard.ts
import { Injectable } from '@angular/core';
import {
ActivatedRouteSnapshot,
RouterStateSnapshot,
UrlTree,
CanActivate,
Router,
} from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from './auth.service';
@Injectable({
providedIn: 'root',
})
export class AuthGuard implements CanActivate {
constructor(public authService: AuthService, public router: Router) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> | Promise<boolean> | boolean {
if (this.authService.isLoggedIn() !== true || this.authService.isAuthenticated() == null) {
window.alert('Access not allowed!');
this.router.navigate(['']);
}
return true;
}
}
我的身份验证守卫所做的是检查令牌是否存在于本地存储中。如果存在,则通过检索令牌、对其进行解码并将其添加到 get 方法来检查用户是否存在于数据库中。isAuthenticated 函数在第一次尝试时有效,但在随后的尝试中,它甚至根本没有运行,我真的很困惑为什么它没有运行。
身份验证服务.ts
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import {
HttpClient,
HttpHeaders,
HttpErrorResponse,
} from '@angular/common/http';
import { Observable, throwError} from 'rxjs';
import { catchError, map } from 'rxjs/operators';
import { User } from '../shared/IUser';
@Injectable({
providedIn: 'root',
})
export class AuthService {
API_URL: string = 'http://localhost:3000';
headers = new HttpHeaders().set('Content-Type', 'application/json');
currentUser = {};
userId: string;
constructor(private httpClient: HttpClient, public router: Router) {}
login(user: User): Observable<any> {
return this.httpClient.post<User>(`${this.API_URL}/login`, user);
}
getAccessToken() {
return localStorage.getItem('access_token');
}
isLoggedIn(): boolean {
let authToken = localStorage.getItem('access_token');
return authToken !== null ? true : false;
}
isAuthenticated() {
let authToken = this.getAccessToken();
const claimString = atob(authToken.split('.')[1]);
const claims = JSON.parse(claimString);
this.getUserProfile(claims.userId).subscribe((res) => {
this.userId = res._id;
});
return this.userId;
}
logout() {
if (localStorage.removeItem('access_token') == null) {
this.router.navigate(['auth']);
}
}
getUserProfile(id): Observable<any> {
return this.httpClient
.get(`${this.API_URL}/users/${id}`, { headers: this.headers })
.pipe(
map((res: Response) => {
return res || {};
}),
catchError(this.handleError)
);
}
handleError(error: HttpErrorResponse) {
let msg = '';
if (error.error instanceof ErrorEvent) {
// client-side error
msg = error.error.message;
} else {
// server-side error
msg = `Error Code: ${error.status}\nMessage: ${error.message}`;
}
return throwError(msg);
}
}