使用AngularJS&;创建跨子域Cookie/会话;PHP
我的应用程序具有以下结构:前端js应用程序(angular)位于使用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
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您以前使用过哪个版本?