3

我的应用程序具有以下结构:子域上有前端 js 应用程序(角度),app.根有后端(PHP)和api.子域上有后端(PHP)。我的登录是通过存储会话 cookie 的 root 完成的。cookie 存储在路径为“/”的所有子域中。

直接在api上我可以得到cookie。然而,在相同的 url 上,但通过来自前端的 ajax GET 调用,cookie 为 NULL。

但是使用像 Postman(chrome 应用程序)这样的应用程序对同一 URL 的 GET 请求,我可以获取 cookie。所以它似乎特定于我的应用程序前端。

这是我的角度应用程序的设置。我在我的应用配置中设置了这些默认值:

$httpProvider.defaults.useXDomain = true;
$httpProvider.defaults.withCredentials = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

我已经在 Chrome 和 FF 上进行了测试。无法弄清楚为什么我的 cookie/会话在我的前端和后端之间不可用

2013 年 11 月 20 日更新

我使用的 Angular 版本也有问题。因为我使用$resource的不是just $http,所以那个版本的angular在使用时没有将withCredentials设置附加到http请求$resource。更新到最新的 angularjs 版本解决了我的问题。因为没有设置 withCredentials 我的 cookie 没有与 xhr 请求一起发送。愚蠢的是,我没有检查是否正在发送 cookie。

4

2 回答 2

5

withCredentials属性不足以使其正常工作。服务器响应必须具有Access-Control-Allow-Credentials: true标头。

您还应该检查请求和响应中的Access-Control-Request-HeadersandAccess-Control-Allow-Headers以及其他Access-Control-...标头,并确保服务器正确处理 OPTIONS 方法请求和所有 CORS 标头。

另见:http ://www.html5rocks.com/en/tutorials/cors/

于 2013-11-16T19:51:15.790 回答
4

Cookie 可见性 - 解释

以下是有效的 cookie 设置标头的样子:

Set-Cookie: name=Anshuman; 域名=www.stronia.com;路径=/

所以现在,让我解释一下上面的行。

小路:

Path=/是 cookie 可见的默认路径。因此,它与不指定任何路径一样好。

当我们说路径将是/. 我们的意思是所有路径的子路径/都可以访问 cookie。因此,/foo将能够访问 cookie,/foo/bar将能够访问 cookie,/foo/bar/...../anything也将能够访问 cookie,因为它们都是 path 的孩子/

假设提到的路径是/mypath。请注意,上述路径的父母(如 ( /))或兄弟姐妹(如 ())或兄弟姐妹/myotherpath的孩子(如 ( /myotherpath/a/b/c))将无法访问 cookie。

它只是提到的路径及其访问 cookie 的子节点。

简而言之,任何以上述路径开头的路径都会收到来自浏览器的 cookie。

领域:

当我们说域将是www.stronia.com我们的意思是作为域的子域的所有域都www.stronia.com可以访问 cookie。因此foo.www.stronia.com将获得对 cookie 的访问权,bar.foo.stronia.com将获得对 cookie 的访问权,还将获得对 cookieanything.....bar.foo.stronia.com的访问权,因为上述所有域都是指定域的子域:www.stronia.com.

但请注意,上述域的父母(stronia.com.com)或兄弟姐妹(如(sib.stronia.com))或兄弟姐妹(如)的孩子a.b.c.d.sib.stronia.com将无法访问 cookie。

它只是提到的域及其访问 cookie 的子项。

简而言之,任何以上述域结尾的域都会收到来自浏览器的 cookie。


你的问题 - 解决了

现在,在您的情况下,您希望 cookie 由app.子域和api.子域共享。所以你所要做的就是,使用我上面提到的规则来设置两个子域都可以接收的cookie。

所以在 php 代码中,假设你的域名是yourdomain.com

setcookie ("CookieName", "CookieValue", $expirationtime , "/", "yourdomain.com");

在 Laravel4 中:

put( 'CookieName','CookieValue', $expirationtime, '/', 'yourdomain.com');

如果您这样做,您的 cookie 将对app.yourdomain.com和都可见api.yourdomain.com

于 2013-11-20T11:24:36.773 回答