Ajax 使用 withCredentials 调用:true 不在请求中发送 cookie

Ajax call with withCredentials: true is not sending cookie in request

我的场景: example.com 是用户正在访问的 django 页面。会话由服务器设置。现在,我在另一个名为 xyz.com 的域上有前端应用程序,现在,我需要在 example.com 上调用 API,所以我试图用 withCredentials: true 进行 ajax 调用。但它似乎没有在请求中发送 cookie 'sessionId'。

我已经看到一些堆栈溢出的答案,但建议的答案不起作用。 link1 link2 link3

我一直在尝试的是: 我的后端是用 Django 编写的,所以我尝试设置

CORS_ALLOW_CREDENTIALS = True
    # Cross Origin Request Settings (CROS)
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_METHODS = (
    'GET',
    'POST',
    'PUT',
    'PATCH',
    'DELETE',
    'OPTIONS'
)
CORS_ALLOW_HEADERS = (
    'x-requested-with',
    'content-type',
    'accept',
    'origin',
    'authorization',
    'x-csrftoken',
    'cache',
    'cookie',
)

CORS_ORIGIN_WHITELIST = [
    '*'
]

SESSION_COOKIE_HTTPONLY = False

SESSION_COOKIE_DOMAIN = 'example.com'

我正在使用 ajax 在 example.com

上进行 api 调用
jQuery.ajax({
 url: "http://example.com/api/v1/admin/settings/",
 dataType: 'json',
 xhrFields: { withCredentials: true },
 success: function(data) {
 console.log(data);
 }
});

我正在回答我的问题,以防万一有人遇到同样的情况。

我发现在 django 中 SESSION_COOKIE_SAMESITE 默认是 Lax

'Lax' (default): provides a balance between security and usability for websites that want to maintain user’s logged-in session after the user arrives from an external link.

In the GitHub scenario, the session cookie would be allowed when following a regular link from an external website and be blocked in CSRF-prone request methods (e.g. POST).

所以我不得不在设置中将其设置为 None 以允许浏览器发送 cookie。

SESSION_COOKIE_SAMESITE = None

参考文档here