[英]How to redirect to logout when token expired in angular?
我有一个 angular 13 申请。 在那里我使用 JWT 令牌进行身份验证。 一切正常。 但是我给 JWT 令牌的令牌到期时间是 1 小时。 一旦令牌在服务器端过期,我想将用户从前端应用程序中注销。
我这样做了,但似乎有问题并且对我不起作用:
export class authInterceptor implements HttpInterceptor {
constructor(private userService: UserService) {
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (this.userService.isAuthentificated()) {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${this.userService.getToken()}`
}
});
}
return next.handle(request).pipe(
tap(event => {
}, error => {
this.onSubscribeError(error);
})
);
}
private onSubscribeError(error: any): void {
if (error.status === 401 || error.status === 403) {
this.userService.logout();
}
}
}
谁能告诉我我做错了什么并帮我改正?
E. Maggini 提供的链接在技术上很好,但接受的答案至少只与让服务器决定它是否过期有关。
如果您没有调用服务器并收到 401,您的 UI 将保持登录状态,直到您这样做。
你需要两者的结合; 一个添加到您的拦截器以检查您的 401 并将您注销(当然)并且应用程序本身检查令牌。
最简单的是在 go 上设置一个时间间隔来检查您的令牌是否过期。
假设您有某种具有基本登录/注销处理功能的 singleton AuthService
...
@Injectable()
export class AuthService {
private jwt: string;
private expiryTimer: any;
public login(jwt: string): void {
this.jwt = jwt;
this.expiryTimer = setInterval(() => { this.checkExpiry(); }, 60000);
this.router.navigate(['...']);
}
public logout(): void {
this.jwt = undefined;
if (this.expiryTimer) clearInterval(this.expiryTimer);
this.router.navigate(['...']);
}
private checkExpiry(): void {
if (this.jwtService.hasExpired(this.jwt)) this.logout();
}
}
假设您有一些 jwt 服务或方法或诸如此类的东西来检查到期...
它看起来会比这更复杂,因为您可能实际上将令牌存储在某个地方(本地存储?)以便处理页面刷新等。
但基础知识就在那里——不要想太多,它就像每隔 x(1 米足够好?)检查一次令牌一样简单,如果它已过期,请注销……
您修改后的拦截器将使用相同的东西; 得到一个 401? this.authService.logout();
. 完毕。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.