1

我有一个脚本设置,允许我通过 JavaScript 跨两个域进行通信 - from foo.example.comto bar.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 中读取。因此,如果我转储会话,它只是一个空白会话外壳。

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

有任何想法吗?

4

1 回答 1

0

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

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

我会在这里发帖确认。

于 2013-09-11T08:09:37.533 回答