Django 服务器不接受 cookies

问题描述 投票:0回答:1

当我尝试使用 Axios 请求中包含的凭据或使用 Postman 应用程序向服务器上托管的 DJANGO 应用程序发送 POST 请求时,我无法访问应用程序中的 cookie,因为 cookie 永远不会发送。

Axios 配置如下所示:

export function genericApiHost(host: string) {
  const headers = {
    "Content-Type": "application/json",
    Accept: "application/json",
    // "Access-Control-Allow-Origin": true,
  };
  return axios.create({
    baseURL: `${host}`,
    headers: headers,
    withCredentials: true,
  });
}

如果我包含允许原始标头,我会收到 CORS 错误,否则,不会发送 cookie。

这是 Django 应用程序设置的一部分:

CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_CREDENTIALS = True
CSRF_COOKIE_SECURE = False
CSRF_COOKIE_HTTPONLY = False
CSRF_TRUSTED_ORIGINS = ['*']
ALLOWED_HOSTS = ["*"]

按照我这里列出的设置,应用程序在本地可以正常工作,但是当代码上传到nginx服务器时,它就不起作用了

django nginx csrf django-csrf django-cors-headers
1个回答
0
投票

根据您提供的信息,在发送带有凭据的 POST 请求时,您似乎在访问 Django 应用程序中的 cookie 时遇到问题。您提到 cookie 永远不会发送,并且您无法访问它们。您还提到,如果包含允许原始标头,则会收到 CORS 错误,如果不包含它,则不会发送 cookie。

您已将

CORS_ALLOW_ALL_ORIGINS
CORS_ALLOW_CREDENTIALS
设置为
True
,并将
CSRF_COOKIE_SECURE
CSRF_COOKIE_HTTPONLY
CSRF_TRUSTED_ORIGINS
ALLOWED_HOSTS
设置为
False
False
['*']
,并且
["*"]
, 分别。这些设置在本地可以正常工作,但是当你将代码上传到nginx服务器时,就不起作用了。

根据您的描述,您似乎面临CORS问题。您提到的错误消息表明浏览器由于 SameSite 属性而阻止了 cookie。该属性默认设置为Lax,这会阻止在跨站点请求中发送cookie。要解决此问题,您需要更新 cookie 的属性。以下是如何在 Django 中设置 cookie 的示例:

response.set_cookie(
    key='csrftoken',
    value=request.META['CSRF_COOKIE'],
    expires=settings.SIMPLE_JWT['REFRESH_TOKEN_LIFETIME'],
    path=settings.SIMPLE_JWT['AUTH_COOKIE_PATH'],
    secure=settings.SIMPLE_JWT['AUTH_COOKIE_SECURE'],
    httponly=False,
    samesite='Lax'
)

您还可以尝试在 Django 应用程序设置中将

CSRF_COOKIE_SECURE
CSRF_COOKIE_HTTPONLY
设置为
True
。此外,您可能需要检查您的服务器是否设置了
Access-Control-Allow-Origin
标头。如果没有,您可以将其添加到您的服务器配置中以允许跨源请求。

© www.soinside.com 2019 - 2024. All rights reserved.