我在Django / Angular项目中使用JWT身份验证,当旧的过期时我试图获取新的访问令牌时,发生了奇怪的事情。
我得到了不允许的405开机自检方法。我已经设置了corsheader,以允许所有方法和外部主机访问该应用程序。 当我发送刷新令牌以获取新的访问令牌时,请求看起来不错。
我注意到的是,它仅在向django发送POST请求以在显示数据之前访问一些数据的页面上发生。 当我在发送GET请求或不发送任何请求的页面上时,获取新令牌的效果非常好。
请查看代码和响应。
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?