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

使用AngularJS&;创建跨子域Cookie/会话;PHP,php,angularjs,session,cookies,laravel-4,Php,Angularjs,Session,Cookies,Laravel 4,我的应用程序具有以下结构:前端js应用程序(angular)位于app.子域上,后端(PHP)位于根和api.子域上。我的登录是通过存储会话cookie的根用户完成的。存储路径为“/”的所有子域的cookie 我可以直接在api上获得cookie。但是,在同一url上,通过来自前端的ajax GET调用,cookie为空 但是,使用像Postman(chrome应用程序)这样的应用程序,可以向同一URL发送GET请求,我就可以获得cookie。因此,它似乎是特定于我的应用程序前端 以下是我的an

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

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

但是,使用像Postman(chrome应用程序)这样的应用程序,可以向同一URL发送GET请求,我就可以获得cookie。因此,它似乎是特定于我的应用程序前端

以下是我的angular应用程序的设置。我已在我的应用程序配置中设置了以下默认值:

$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
,所以在使用
$resource
时,angular的该版本没有将
withCredentials
设置附加到http请求。更新到最新的angularjs版本修复了我的问题。因为没有设置withCredentials,所以我的Cookie没有与xhr请求一起发送。愚蠢的是,我没有检查是否发送了cookies。

带有凭据的
属性不足以让它工作。服务器响应必须具有
访问控制允许凭据:true

您还应该检查
访问控制请求标头
访问控制允许标头
,以及请求和响应中的其他
访问控制-…
标头,并确保服务器正确处理选项方法请求和所有CORS标头

另请参见:

Cookie可见性-解释 以下是有效的cookie设置头的外观:

设置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
的子域的所有域都可以访问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由
应用程序。
子域和
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

都可见。您在api中使用过setCookie()中的域参数吗?我使用的是Laravel 4。在我的配置中,我已将其设置为所有子域,路径设置为“/”。您是否考虑过使用HTML5的浏览器本地存储而不是cookies。在进行身份验证时,我的会话也存在无法持久化的问题。例如,我已登录,但从前端通过ajax调用访问时未登录。您确定服务器端的CORS配置正确吗?显示GET(和选项)请求的所有请求和响应头。仔细查看
访问控制-…
标题。感谢您没有在服务器上设置凭据设置。另外,请查看我的问题更新,其中有一个问题是我没有使用$resource http设置withCredentials配置wrapper@iamjonesy您以前使用过哪个版本?