只有在浏览器中访问网站后,跨域会话共享才能工作



我有一个脚本设置,允许我通过JavaScript跨两个域进行通信——从foo.example.combar.example.com

当跨域请求到达我的服务器时,我确保按如下方式设置Access Control Headers(在Kohana中):

$this->response->headers('Access-Control-Allow-Origin', 'foo.example.com'));
$this->response->headers('Access-Control-Allow-Credentials', 'true');
$this->response->headers('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');

我还确保Kohana知道我想在子域之间共享我的cookie:

Cookie::$expiration = 60 * 60 * 24 * 14;
Cookie::$salt = 'salt-string-which-is-the-same-on-both-domains';
Cookie::$httponly = TRUE;
Cookie::$domain = '.example.com';

我已经将JavaScript设置为使用单个域(因为我也有跨域的iframe):

document.domain = "example.com";

在进行$.ajax()请求时,我还使用xhrFields属性:

xhrFields: {
    withCredentials: true
}

问题

我遇到的问题是,当我使用它来执行跨域AJAX请求时,第二个实例bar.example.com上的会话不会从发送给它的cookie中读取。因此,如果我转储会话,它只是一个空白的会话外壳。

然而,如果我直接访问第二个实例,然后尝试我的AJAX脚本,一切都会按预期进行。这让我相信问题出在阅读cookie上。

有什么想法吗?

我相信我已经找到了导致此问题的原因。因为这两个域都由单独的实例提供服务,所以它们运行着独特的PHP环境。我的代码目前使用的是原生PHP会话,所以当cookie被发送到第二台服务器时,它会得到没有分配数据的ID。

只有手动访问网站才能触发数据分配,因为它会自动运行身份验证和授权程序。我将切换到使用Kohana中的数据库会话。两个实例都指向同一个DB,因此这应该可以解决问题。

我会寄回这里确认。

相关内容

  • 没有找到相关文章

最新更新