使用 AngularJS 和 PHP 创建跨子域 cookie/会话


Create cross subdomain cookies/sessions with AngularJS & PHP

我的应用程序具有以下结构:app.子域上有前端JS应用程序(Angular),根和api.子域上有后端(PHP)。我的登录是通过存储会话cookie的根完成的。Cookie 存储所有路径为"/"的子域。

直接在 api 上,我可以得到饼干。然而,在同一个网址上,但通过来自前端的ajax GET调用,cookie是空的。

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

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

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

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

更新 20/11/2013

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

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

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

另请参阅:http://www.html5rocks.com/en/tutorials/cors/

Cookie 可见性 - 解释

以下是

有效的 cookie 设置标头的外观:

设置饼干:名称=安斯曼;域=www.stronia.com;路径=/

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

路径:

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

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

假设提到的路径是/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的访问权限,anything.....bar.foo.stronia.com也将获得对cookie的访问权限,因为上述所有域都是指定域的子域: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");

在拉拉维尔4中:

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

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