带有 withCredentials 的 Ajax 调用:true 不是在请求中发送 cookie

Posted

技术标签:

【中文标题】带有 withCredentials 的 Ajax 调用:true 不是在请求中发送 cookie【英文标题】:Ajax call with withCredentials: true is not sending cookie in request 【发布时间】:2019-04-02 19:18:44 【问题描述】:

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

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

我一直在尝试: 我的后端是用 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);
 
);

【问题讨论】:

【参考方案1】:

我正在回答我的问题,以便在有人陷入相同情况时提供帮助。

我发现在 django 中 SESSION_COOKIE_SAMESITE 默认为 Lax

“Lax”(默认):为希望在用户从外部链接到达后保持用户登录会话的网站提供安全性和可用性之间的平衡。

在 GitHub 场景中,会话 cookie 将被允许 遵循来自外部网站的常规链接并被阻止 容易发生 CSRF 的请求方法(例如 POST)。

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

SESSION_COOKIE_SAMESITE = None

参考文档here

【讨论】:

以上是关于带有 withCredentials 的 Ajax 调用:true 不是在请求中发送 cookie的主要内容,如果未能解决你的问题,请参考以下文章

在 Firefox 的 jQuery $ajax 调用中使用 xhrFields: withCredentials: true 时的状态码 = 0

CORS $.ajax 会话 cookie(访问控制允许凭据和 withCredentials=true)

Ajax POST - 不推荐用于同步请求的“XMLHttpRequest.withCredentials”

Web API OWIN 从 $.AJAX POST withCredentials:true 接收空数据

即使使用 withCredential: true,axios 也无法发送带有请求的 cookie

ajax跨域请求无法携带cookie的问题