使用 fetch() 发送的每个请求都有不同的 sessionId cookie,这使我无法跨请求跟踪会话

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

我有一个在 localhost:3000 上运行的 React 前端应用程序,以及在 127.0.0.1:8000 上运行的 Django 后端服务器

我正在使用 fetch() 从函数发送请求 同时使用 widthCredentials 和 Access-Control-Allow-Credentials 可能有点矫枉过正,但我现在正在尝试任何事情。

        const response = await fetch(url, {
            method: 'POST',
            mode: 'cors',
            credentials: 'include',
            headers: {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Credentials': 'true',
                'withCredentials': 'true',
 
            },
            body: JSON.stringify(data)
        })

在我的 Django 后端中,我已经安装了 django-cors-headers 并正确设置了所有设置。

Djang 没有抱怨任何请求,所以我相信我的 Django 设置是正确的。 由于某种原因,每个请求中的 sessionId cookie 都是不同的,因此我无法使用它来跟踪跨请求的会话。相反,Django 会为每个请求创建一个新会话。

Django 设置

INSTALLED_APPS = [
    ....
    'corsheaders',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    ...
]

CORS_ALLOW_ALL_ORIGINS = False
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",
]

CORS_ALLOW_HEADERS = [
    "accept",
    "accept-encoding",
    "authorization",
    "content-type",
    "dnt",
    "origin",
    "user-agent",
    "x-csrftoken",
    "x-requested-with",
    "cache-control",
    "pragma",
    "access-control-allow-credentials",
    "withCredentials",
]


# use file to store sessions
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = "/path/to/dir"

SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_DOMAIN = "localhost"
SESSION_COOKIE_SECURE = True  # if this is to TRUE cookies dont work propoerly, not sure why
# SESSION_COOKIE_SAMESITE = 'None'
SESSION_COOKIE_SAMESITE = 'None'
django http cookies cors
1个回答
0
投票

您的问题可能是由于

SESSION_COOKIE_DOMAIN
SESSION_COOKIE_PATH
设置不正确造成的。以下是解决此问题的几个步骤:

  1. SESSION_COOKIE_DOMAIN

    • 对于本地开发,您应该将此设置留空或设置为
      None
      。将其设置为
      "localhost"
      通常是不正确的,因为为
      "localhost"
      设置的 cookie 可能不会被浏览器接受。
  2. SESSION_COOKIE_PATH

    • 应将其设置为
      "/"
      ,除非您的 Web 应用程序托管在特定路径上。
  3. 其他设置

    • 确保
      'django.contrib.sessions'
      在您的
      INSTALLED_APPS
      中并且
      'django.contrib.sessions.middleware.SessionMiddleware'
      在您的
      MIDDLEWARE
      中。

这是 Django 设置的修改后的配置:

Django 设置

INSTALLED_APPS = [
    ....
    'corsheaders',
    'django.contrib.sessions',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...
]

CORS_ALLOW_ALL_ORIGINS = False
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",
]

CORS_ALLOW_HEADERS = [
    "accept",
    "accept-encoding",
    "authorization",
    "content-type",
    "dnt",
    "origin",
    "user-agent",
    "x-csrftoken",
    "x-requested-with",
    "cache-control",
    "pragma",
    "access-control-allow-credentials",
    "withCredentials",
]

SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = "/path/to/dir"

SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_DOMAIN = None  # For local development
SESSION_COOKIE_PATH = "/"
SESSION_COOKIE_SECURE = False  # Should be False for local development
SESSION_COOKIE_SAMESITE = 'None'
© www.soinside.com 2019 - 2024. All rights reserved.