【发布时间】:2020-07-27 00:37:20
【问题描述】:
我正在尝试创建一个跨多个域(由我控制)持续存在的登录。我的策略是,在成功的登录响应后,我发送一个 CORS 请求来获取其他每个所需域的 cookie。在返回 cookie 时,我会重定向到用户的主页(可能在任何域上)
如果我注释掉重定向,我发现一切正常:所有 CORS cookie 均已设置,并且我已在其他域登录。但是,当我重定向时,有时未设置 CORS cookie。这是我在客户端的代码的总体思路:
// This is running client side when the user visits "A.com/index.html"
// PLEASE NOTE: the distinction between A.com and B.com is important
$.post('https://A.com/attemptLogin', function(data) {
if (!data.success) { return; }
var token = data.loginToken;
var userURL = data.userURL; // userURL may be in A.com or B.com...
// now get a cookie at the alternate domain B.com
$.ajax({
url: 'http://B.com/getDomainCookie/' + token,
method: 'GET',
xhrFields: { withCredentials: true },
success: function() {
// if I comment out the next line, the cookie is always set successfully
// if I leave the line in, it is hit or miss whether the cookie is set.
location.href = userURL;
}
});
});
我的猜测是ajax回调是在浏览器完成cookie设置之前触发的,可能与它是B.com cookie有关,而这段代码是在A.com上运行的。
感谢任何帮助。这是我发布的第一个问题,因此也感谢对问题礼仪和格式的建设性批评!
【问题讨论】:
-
明确一点,对
'http://B.com/getDomainCookie/' + token的GET请求应该设置cookie然后返回?如果这是您想要的,那么我认为您的问题出在 B 端,其中异步函数设置 cookie 并返回响应。有可能吗? -
@cventr,是的,对 B.com 的 GET 纯粹是为了设置 cookie。返回仅包含 OK 响应和 B.com 域的 cookie。至于B端的async,我不太清楚你的意思……我控制B.com/getDomainCookie另一端的服务器,它肯定会返回我想要的响应。
-
好的,我看不到 B 端的内容,所以我只是想猜测:您确定在设置 cookie 后立即返回响应吗?因为您使用的函数可能是异步的,并且在实际设置 cookie 之前返回响应
-
@cventr,我觉得不是这样,因为如果我留在页面上,cookie 总是被设置的。但为了彻底一点,我可以告诉你,/getDomainCookie 后面的(node express style )端点以这样的两行结尾:
res.cookie('name', 'value'); return res.send(200);字面意思是一行接一行,所以应该始终设置 cookie。 -
如果cookie在返回200状态之前写入成功,可以不测试B面吗?
标签: javascript jquery cookies browser cross-domain