最终确定令牌过期时未命中 http 拦截器

Posted

技术标签:

【中文标题】最终确定令牌过期时未命中 http 拦截器【英文标题】:Finalize on http interceptor not being hit when token expires 【发布时间】:2019-12-23 14:23:18 【问题描述】:

我是第一次尝试 MEAN,但在 jwt 令牌到期时的错误处理方面遇到了一些阻力。我在 express 服务器上有错误处理程序。

const handleUnauthorisedError = (err: any, req: any, res: express.Response, next: any) => 
    if (err.name === "UnauthorizedError") 
        if (err.message === "jwt expired") 
            res.header("Token-Expired", "true");
        

        console.error(err);
        res.status(401);
        return res.json( message: `$err.name: $err.message` ).end();
    
;

然后在路由之后添加到这里。

app.use("/api", setupRoutes());
app.use(handleUnauthorisedError);

在我的角度拦截器中,我有这个错误处理程序

private handle401Error = (err: HttpErrorResponse, req: HttpRequest<any>, next: HttpHandler) => 
    console.log(err.headers);

    if (err.headers.has("Token-Expired")) 
        this.tokenSubject.next(null);

        return this.authenticationService.refresh().pipe(switchMap(() => 
            return next.handle(this.addToken(req));
        ), catchError(() => 
            return this.authenticationService.logoutExpired().pipe(finalize(() => 
                this.router.navigate(["/login"]);
            ));
        ));
    

    return this.authenticationService.logoutExpired().pipe(finalize(() => 
        this.router.navigate(["/login"]);
    ));

但是,除非我终止快速服务器,否则似乎永远不会发生最终确定。好像连接可能会持续存在?

Z

【问题讨论】:

【参考方案1】:

我认为finalize 不会发生,因为当源完成或引发错误 时,此运算符起作用。更多关于这个here。

finalize 运算符视为来自try/catchfinally 语句。

在您的代码中,您只是发出值。

出现的另一个问题是为什么你会使用finalize? 当我处理 http 调用时,我会使用它。

但是,如果出于某种原因您仍想使用此运算符,则可以确保从this.authenticationService.logoutExpired() 抛出错误:

 logoutExpired () 
  // Some logic here..
  return throwError('err');

Here is a little StackBlitz demo.

【讨论】:

那么express api的响应没有完成吗?我在连接到 dot net core api 的应用程序上使用了相同的拦截器代码,它运行良好。 可能是express有问题,我没太注意。如果您删除一些错误处理代码,您应该查看 BE api 是否正常工作。尝试在这里和那里放置一些控制台日志来检查您的应用程序的流程。让我知道它是否有效!

以上是关于最终确定令牌过期时未命中 http 拦截器的主要内容,如果未能解决你的问题,请参考以下文章

Vue 资源拦截器刷新 JWT 令牌

Axios Intercept 在第一次调用时未从 localStorage 应用令牌

重新发送使用过期令牌发出的请求会导致开发人员工具处于待处理状态

RestKit ,如果是由于令牌过期引起的,则拦截失败的请求/重试

浏览器中直接 URL 命中的 Jwt 令牌身份验证

Grpc令牌过期处理