当原始请求是POST方法时,Auth刷新令牌不起作用

时间:2019-07-01 14:35:39

标签: javascript django-rest-framework axios

我有一个js客户端(vuejs)和一个在本地都使用DRF的后端。

我使用此程序包生成令牌:https://github.com/davesque/django-rest-framework-simplejwt

我使用此软件包https://www.npmjs.com/package/axios-auth-refresh处理刷新令牌逻辑。

主要目标是在请求返回401响应时拦截该请求,执行刷新令牌请求,然后使用新令牌解决原始请求。

当原始请求是GET请求时有效,而当它是POST请求时无效。

使用POST请求时:

原始请求在令牌到期时落入401,然后发生拦截器,但服务器不允许使用405方法进行响应:

-https://imgur.com/C1tchvb

拦截器的请求中的方法与上面的代码(第3行和第4行)中的方法不匹配:如您所见,服务器从原始请求中接收了有效载荷作为请求的方法:

-https://imgur.com/nlAknMi

我发现了这篇文章:App Script sends 405 response when trying to send a POST request

我尝试按照建议更改标题,但没有成功

当原始请求是带有有效载荷的Post请求时,原始请求的有效载荷如何成为拦截器的方法?

这是来自javascript客户端的代码:

const refreshAuthLogic = failedRequest => axios(
  {
    method: 'post',
    url: 'auth/refresh',
    data: { refresh: store.state.token.refresh }
  }).then(tokenRefreshResponse => {
  store.dispatch('refreshToken', tokenRefreshResponse.data)
  return Promise.resolve()
})

const instance = axios.create({
  baseURL: '/api/'
})
instance.interceptors.request.use(config => {
  config.headers.Authorization = `Bearer ${store.state.token.access}`
  return config
})

createAuthRefreshInterceptor(instance, refreshAuthLogic)

编辑

我设法使其正常工作,但我不太了解:

  • 问题与DJANGO / DRF有关,与axios无关
  • 看来,当POST请求完成且失败(此处为401)时,服务器会保留数据。

这是我无法解释的部分:

  • 当拦截器(用于刷新令牌)的请求到达服务器时,它会与先前请求的数据混淆。

当请求以401失败时,我不得不在django中添加一个中间件来清除主体,并且对我有用。但这不是一个合适的解决方案。

1 个答案:

答案 0 :(得分:0)

不幸的是,lib是松散维护的,并且在某些方面有缺陷。

例如:当使用无效令牌发送请求时,并发请求未正确排队,但是当已经发出新令牌时响应到达。

按原样,如果您查看lib source,则会在第一行中找到:

/** @type {Object} */
const defaults = {

    /** @type {Number[]} */
    statusCodes: [
        401 // Unauthorized
    ]
};

这意味着仅管理401代码,并且不会导出statusCode,因此它们保持私有状态。

如果要继续使用此库,可以对其进行派生,以更改不适合堆栈的内容,或者仅复制源代码,对其进行编辑并将其用作本地服务。