刷新令牌后,对原始 API 的现有请求将替换为 /refersh-token API,因此我需要仔细检查按钮上的数据

问题描述 投票:0回答:1

当令牌过期时 next:HttpHandler 处理来自服务器的请求,当它进入refershToken Subscribe 方法时,它会转到我在 next.handle(request) 上面定义的标头,然后再次转到下一个。所以我之前的请求会发送到客户端,并且不会使用刷新令牌进行更新,现在我现有的请求是 /refersh-token。因此,更新令牌后,我需要仔细检查记录按钮或重新加载记录页面。


// add authorization header with jwt token if available

refreshToken是authenticationService类中的API配置

refreshToken() {
  return this.http.get<CommonResponse>(`${environment.apiUrl}/refresh-token`);
}

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

const currentUser = this.authenticationService.currentUserValue;
if (currentUser?.token && 
  !environment.publicURLS.includes(request.url.replace(environment.apiUrl, "")) 
  && !this.router.url.includes("https://www.google.com/inputtools/request")) {
  request = request.clone({
    setHeaders: {
      Authorization: `Bearer ${currentUser.token}`,
    },
  });
}


return next.handle(request).pipe(tap((data: any) => {
      if (data.body?.body) {
        if (data.body.body.isTokenExpired) {
          this.authenticationService.refreshToken().pipe(map((res) => {
            return res;
          })).subscribe(res => {
            if (res?.body && !res?.isError && res?.body?.token) {
              const currentUser = this.authenticationService.currentUserValue;
              if (currentUser) {
                currentUser.token = res.body.token;
                localStorage.setItem('currentUser', JSON.stringify(currentUser));
                this.authenticationService.currentUserValueSubject.next(currentUser);
                const retryRequest = request.clone({
                  setHeaders: {
                    Authorization: 'Bearer ' + currentUser.token,
                  },
                });
                next.handle(retryRequest);
              }
            }
          }
          );
        }
        if (data.body.body.isTokenInvalid) {
          this.authenticationService.logout();
        }
      }
    }
    ));
  }
angular interceptor rxjs-observables angular-httpclient-interceptors
1个回答
0
投票

您的令牌刷新机制似乎遇到了问题。更新令牌后,您需要使用新令牌重试原始请求。在您的代码中,重试部分似乎缺少实际发送重试请求所需的返回语句。

更换:

next.handle(retryRequest);

与:

return next.handle(retryRequest);

这确保了重试的请求确实被发送。这是代码的修改部分:

const retryRequest = request.clone({
  setHeaders: {
    Authorization: 'Bearer ' + currentUser.token,
  },
});

// Return the observable here to trigger the retried request
return next.handle(retryRequest);

通过进行此更改,现在应该使用刷新的令牌发出后续请求。请随意测试并根据需要进行调整。

© www.soinside.com 2019 - 2024. All rights reserved.