nginx Django服务器不接受cookies

drnojrws  于 12个月前  发布在  Nginx
关注(0)|答案(1)|浏览(153)

当我尝试使用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,
  });
}

字符串
如果我包含allow origin头,我会得到一个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服务器时,它无法工作

kr98yfug

kr98yfug1#

根据您提供的信息,您在使用凭据发送POST请求时似乎无法访问Django应用程序中的Cookie。您提到Cookie永远不会发送,您无法访问它们。您还提到如果包含allow origin头,则会收到CORS错误,如果不包含它,则不会发送Cookie。
您已经将CORS_ALLOW_ALL_ORIGINSCORS_ALLOW_CREDENTIALS设置为True,并将CSRF_COOKIE_SECURECSRF_COOKIE_HTTPONLYCSRF_TRUSTED_ORIGINSALLOWED_HOSTS分别设置为FalseFalse['*']["*"]。这些设置在本地可以正常工作,但当您将代码上传到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_SECURECSRF_COOKIE_HTTPONLY设置为True。此外,您可能需要检查您的服务器是否设置了Access-Control-Allow-Origin头。如果没有,您可以将其添加到服务器配置中以允许跨域请求。

相关问题