当我尝试使用 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服务器时,它就不起作用了
根据您提供的信息,在发送带有凭据的 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
标头。如果没有,您可以将其添加到您的服务器配置中以允许跨源请求。