刷新JWT令牌时不允许使用405方法-Django,Angular

时间:2019-11-22 14:00:17

标签: python django angular jwt jwt-auth

我在Django / Angular项目中使用JWT身份验证,当旧的过期时我试图获取新的访问令牌时,发生了奇怪的事情。

我得到了不允许的405开机自检方法。我已经设置了corsheader,以允许所有方法和外部主机访问该应用程序。 当我发送刷新令牌以获取新的访问令牌时,请求看起来不错。

我注意到的是,它仅在向django发送POST请求以在显示数据之前访问一些数据的页面上发生。 当我在发送GET请求或不发送任何请求的页面上时,获取新令牌的效果非常好。

请查看代码和响应。

错误响应 Error response

settings.py

CORS_ORIGIN_WHITELIST = (
  '127.0.0.1:4200',
  '127.0.0.1:8082',
)

CORS_ALLOW_METHODS = [
  'DELETE',
  'GET',
  'OPTIONS',
  'PATCH',
  'POST',
  'PUT',
]

CORS_ALLOW_HEADERS = [
  'accept',
  'accept-encoding',
  'authorization',
  'content-type',
  'dnt',
  'origin',
  'user-agent',
  'x-csrftoken',
  'x-requested-with',
]

处理401错误并获取一个新的令牌

       private handle401Error(request: HttpRequest<any>, next: HttpHandler ) : Observable<any> {
        if(!this.isRefreshing) {
            this.isRefreshing = true;
            this.refreshTokenSubject.next(null);

            return this.userService.refreshToken().pipe(
                switchMap((token:any) => {
                    this.isRefreshing = false;
                    this.refreshTokenSubject.next(token.access);

                    return next.handle(this.addToken(request, token.access));
                }));
        } else {
            return this.refreshTokenSubject.pipe(
                filter(token => token != null),
                take(1),
                switchMap(access => {
                    return next.handle(this.addToken(request, access));
                })
            );
        }
    }


    refreshToken() {
        return this.http.post(`${this.apiUrl}/api/token/refresh`, {
          'refresh': this.getRefreshToken()
        }).pipe(tap((tokens: any) => {
          this.setJwtToken(tokens.access);
        }, err => {
          console.log(err);
        }));
      }

我尝试使用corsheaders,尝试打印所有正在发送的数据和所有拦截器,但是我没有主意。

那些POST请求是否有可能以某种方式切换并且进入错误的URL?

0 个答案:

没有答案