首先,这不是一个重复的问题。我已经尝试了所有关于stackoverflow的相关帖子,但没有找到解决方案。
我有一个后端的Django应用程序和前端的AngularJS应用程序。我正在使用djangorestframework-jwt进行API身份验证。我有一个不需要任何身份验证的API端点,并且在浏览器上仅针对此端点收到CSRF Failed: CSRF cookie not set错误。
在我的django设置中,我有:
ALLOWED_HOSTS = ['*']
并且它不包括任何CSRF_COOKIE_SECURE、CSRF_COOKIE_HTTPONLY或SESSION_COOKIE_SECURE设置。
djangorestframework-jwt设置为:
JWT_AUTH = {
'JWT_SECRET_KEY': SECRET_KEY,
'JWT_ALGORITHM': 'HS256',
'JWT_VERIFY': True,
'JWT_VERIFY_EXPIRATION': True,
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=3000),
'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_AUTH_COOKIE': 'refresh-token'
}我注意到,在浏览器cookie中,如果有任何refresh-token键,那么端点就工作得很好。当浏览器cookie中不存在该密钥时,问题就出现了。我设置了'JWT_AUTH_COOKIE': None或删除了以下行:
'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_AUTH_COOKIE': 'refresh-token'从JWT_AUTH设置,但没有运气。
我还为该端点尝试了@csrf_excempt,但也不起作用。
有趣的是,当我发送邮递员的请求时,它起作用了。
以下是我在前台发送的请求:
$http({
url: url,
method: "PUT",
headers: {
'Content-Type': 'application/json'
},
data: data
})我想知道浏览器cookies中不存在refresh_token密钥时出现错误的原因,以及如何解决此问题。
发布于 2020-08-16 07:35:17
我通过将'X-CSRFToken': $cookies.get("csrftoken")添加到Http请求头部解决了这个问题,因此请求现在看起来如下所示:
$http({
url: url,
method: "PUT",
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': $cookies.get("csrftoken")
},
data: data
})https://stackoverflow.com/questions/63430204
复制相似问题