我有一个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方法进行响应:
拦截器的请求中的方法与上面的代码(第3行和第4行)中的方法不匹配:如您所见,服务器从原始请求中接收了有效载荷作为请求的方法:
我发现了这篇文章: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)
编辑
我设法使其正常工作,但我不太了解:
这是我无法解释的部分:
当请求以401失败时,我不得不在django中添加一个中间件来清除主体,并且对我有用。但这不是一个合适的解决方案。
答案 0 :(得分:0)
不幸的是,lib是松散维护的,并且在某些方面有缺陷。
例如:当使用无效令牌发送请求时,并发请求未正确排队,但是当已经发出新令牌时响应到达。
按原样,如果您查看lib source,则会在第一行中找到:
/** @type {Object} */
const defaults = {
/** @type {Number[]} */
statusCodes: [
401 // Unauthorized
]
};
这意味着仅管理401代码,并且不会导出statusCode,因此它们保持私有状态。
如果要继续使用此库,可以对其进行派生,以更改不适合堆栈的内容,或者仅复制源代码,对其进行编辑并将其用作本地服务。