2011-11-10 186 views
23

我在多个子域(example.com,blog.example.com和app.example.com)之间拥有通用的身份验证表单。登录表单必须不论其中显示这些数据提交给example.com,所以我想利用CORS,但这:跨凭证凭证与资源共享

header("Access-Control-Allow-Origin: http://example.com http://blog.example.com http://app.example.com") 

does not work

所以我想在做下一件事的,并手动检查Origin标在服务器端,并允许Access-Control-Allow-Origin: *,这样的请求可能作出的,但不幸的是,这种作物了in the MDN

重要提示:在响应资格的请求时,服务器必须指定域, nd不能使用百搭梳理。

有什么办法让我的请求可以跨多个域使用,而且仍然使用CORS发送凭证?

+0

我相信你也可以把域名之间用逗号。 (即,是的,你可以让它在多个域中工作。) – BrainSlugs83

+1

我不这么认为。从规格: >在实践中,原产地名单或空产量更受限制。它不是允许以空格分隔的原始列表,而是单个原点或字符串“null”。 [来源](https://www.w3.org/TR/cors/#access-control-allow-origin-response-header) – Nemo

回答

34

两个想法:

1)你是不是也包括“访问控制允许的凭据:真正的”头?这是传递cookie凭证所必需的(并且相应的XHR客户端必须设置.withCredentials = true)

2)您是否尝试了来自链接的建议并仅包含当前请求的来源。例如,如果请求的标题为“Origin:http://blog.example.com”,那么您将使用“Access-Control-Allow-Origin:http://blog.example.com”进行响应,而不是原始列表。这需要在您的服务器端实现上做更多的工作。其他

3)一个想法,你提到你具有必须通过各种域共享一个单一登录表单。那么,如果它是一个标准的HTML表单,你可以在域之间进行常规的表单发布。你不需要使用CORS。只需将表单的“action”属性设置为您想要发布到的网址即可。例如:

<form name="login" action="http://login.example.com/doLogin"> 
+0

我结束了使用(2)。不知何故,我忽略了单一的原点方法。 – Nemo

1
// cross domain 
header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']); 
header('Access-Control-Allow-Credentials: true'); 
+6

不要这样做,如果没有严格验证Origin头文件,或者您会打开安全漏洞 – Tom

+3

这个答案说明了为什么不可能拥有防伪安全 - 甚至是技术上的! >。< – BrainSlugs83

+0

确定看起来这是“本质上”与“*”相同,可以打开微妙的安全漏洞,因此不鼓励,请参阅http://stackoverflow.com/questions/12001269/what-are-the-安全风险设置访问控制允许来源 – rogerdpack