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

时间:2013-11-04 16:34:32

标签: php angularjs session cookies laravel-4

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

直接在api我可以获得cookie。但是在同一个url上,但是通过前端的ajax GET调用,cookie是NULL。

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

以下是我的角度应用的设置。我在我的app config中设置了这些默认值:

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

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

2013年11月20日更新

我也特别关注我使用的Angular版本。由于我使用的是$resource而不是$http,因此在使用withCredentials时,该版本的角度未将$resource设置附加到http请求。更新到最新的angularjs版本已经解决了我的问题。由于未设置withCredentials,因此我的cookie不会与xhr请求一起发送。愚蠢的是我没有检查是否发送了cookie。

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

Cookie可见性 - 解释

以下是有效的Cookie设置标头的外观:

  

Set-Cookie:name = Anshuman;域= 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子域名的所有域都可以访问该域。因此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");

在Laravel4中:

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

如果您这样做,app.yourdomain.comapi.yourdomain.com都会看到您的Cookie。