在浏览器中访问站点之前,跨域会话共享不起作用

时间:2013-09-04 13:50:54

标签: php jquery ajax cross-domain kohana-3

我有一个脚本设置,允许我通过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";

我在发出xhrFields次请求时也使用$.ajax()属性:

xhrFields: {
    withCredentials: true
}

问题

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

但是,如果我直接点击第二个实例然后尝试我的AJAX脚本,一切都按预期工作。这让我相信问题在于阅读cookie。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我相信我找到了造成这个问题的原因。由于两个域都由单独的实例提供服务,因此它们具有独特的PHP环境。我的代码目前正在使用本机PHP会话 - 所以当cookie被发送到第二台服务器时,它会获得没有数据分配的ID。

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

我会在这里回复确认。