【发布时间】:2020-03-06 08:31:59
【问题描述】:
我使用 JWT 进行身份验证(没有登录页面)。 我有一些问题,当网站加载时,首先启动的是加载内容的 get 方法,然后是身份验证方法并将令牌保存在本地存储中。
问题是我得到错误,我没有通过身份验证,在我刷新页面后它的工作。 我需要让他先制定身份验证方法并将他保存到本地存储,然后再加载页面。
身份验证服务:
import { Injectable } from '@angular/core';
import { HttpService } from '../http/http.service';
import * as jwt_decode from 'jwt-decode';
@Injectable({
providedIn: 'root'
})
export class AuthService {
public isDialogOpen = false;
constructor(private http: HttpService) { }
authUser(userID) {
if (localStorage.getItem('token') === null) {
this.http.authUser(userID).subscribe((data) => {
localStorage.setItem('token', data.token);
}, error => {
console.log(error);
});
}
}
removeToken() {
localStorage.clear();
}
getCurrentUser() {
try {
const jwt = localStorage.getItem('token');
return jwt_decode(jwt);
} catch (error) {
return null;
}
}
}
header.interceptor:
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';
import { AuthService } from '../services/auth.service';
@Injectable()
export class HeaderInterceptor implements HttpInterceptor {
constructor(public authService: AuthService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = localStorage.token;
if (!token) {
return next.handle(request);
}
request = request.clone({
setHeaders: {
'Content-Type': 'application/json',
'x-auth-token': token
}
});
return next.handle(request);
}
}
Error.interceptor.ts:
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { AuthService } from '../services/auth.service';
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
constructor(public authService: AuthService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
catchError(err => {
if (err) {
console.log(`Server Error`);
}
if (err.status === 401) {
this.authService.authUser('1');
}
const error = err.error.message || err.statusText;
return throwError(error);
})
);
}
}
【问题讨论】:
-
您是否在身份验证服务中使用了 Route Guard?
-
我现在实现了 Route Guard,但问题是我在页面加载后得到了令牌