刷新angular 5中的访问令牌时出现问题

刷新angular 5中的访问令牌时出现问题,angular,rxjs,rxjs5,angular-http-interceptors,angular-httpclient,Angular,Rxjs,Rxjs5,Angular Http Interceptors,Angular Httpclient,如果用户出现未经授权的错误,我想刷新令牌。我正试图在拦截器中处理这个问题。代码如下: intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { return next.handle(req).do((event: HttpEvent<any>) => { if (event instanceof HttpRespo

如果用户出现未经授权的错误,我想刷新令牌。我正试图在拦截器中处理这个问题。代码如下:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
      return next.handle(req).do((event: HttpEvent<any>) => {
      if (event instanceof HttpResponse) {
      }
    }, (err: any) => {
      if (err instanceof HttpErrorResponse) {
        if (err.status === 401) {
          fn.refreshToken(req, next);

        }
      }
    });
  }
我希望如果令牌过期,调用服务刷新令牌并重新发送失败的原始请求。另外调用失败的原始请求的subscribe方法

请让我知道我的方法是否正确


如果是的话,那么我在这里缺少了什么。

拦截器必须返回一个可观察对象,并且可以调用
next.handle(req)
本身,所以我认为您可以调用
next.handle(req)
两次,但更好、更“Rx”的解决方案是使用
catch
操作符并合并原始的可观察源。此外,您还需要更改
refreshttoken
以返回一个可观察的标记,并且您可能希望将新标记存储在
do()

refreshToken(…):可观察{
返回此内容。_http.post('/refreshtoken',…)
.do(/*在此处保存令牌*/);
}
截取(req:HttpRequest,next:HttpHandler):可观察{
返回下一个句柄(req)
.catch((错误,源)=>{
if(HttpErrorResponse的err instanceof&&err.status==401){
返回此.refreshToken(…)
.concatMap(()=>next.handle(req/*…或更新的req*/);
//或者可以使用.concatMap(()=>source)再次触发相同的请求
}
犯错误;
})
}

jquery也面临同样的问题:。你能帮我一下吗?
refreshToken(req, next) {
    const headers = new HttpHeaders()
        .set('Content-Type', 'application/x-www-form-urlencoded');

    const body = new HttpParams()
      .set('refresh_token', localStorage.getItem('refreshToken'));
     this._http.post('/refreshtoken',  body.toString(), {headers}).subscribe(
       (data) => {
         const header = `Bearer ${(<any>data).accessToken}`;
        const newRequest = req.clone({ headers: req.headers.set('Authorization',  header)});
        return next.handle(newRequest);

       }),
        (err) => {
          console.log(err);
        }

  }
 return next.handle(newRequest).subscribe();
refreshToken(...): Observable<any> {
  return this._http.post('/refreshtoken', ...)
    .do(/* save token here */);
}

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  return next.handle(req)
    .catch((err, source) => {
      if (err instanceof HttpErrorResponse && err.status === 401) {
        return this.refreshToken(...)
          .concatMap(() => next.handle(req /* ... or updated req */ ));
          // or you could use .concatMap(() => source) to trigger the same request again
      }
      throw err;
    })
}