我有一个在前端使用 Angular/js 并在后端使用 PHP 的应用程序。两者都使用相同的域 (www.foo.bar)。
我已经在我的后端实现了 linkedin 身份验证。所以在前端我做了类似的事情
$http({
method: 'POST',
url: 'http://foo.bar/api/authenticate',
headers: { 'Content-Type' : 'application/x-www-form-urlencoded' }
}).success(function(outcome){
console.log("success");
}).error(function(outcome){
console.log('error');
});
然后,我的服务器使用 linkedin 对用户进行身份验证(这包括一些重定向),并最终返回一个包含从 linkedin 检索到的基本个人资料信息的 json。
如果我直接访问我的 api:foo.bar/api/authenticate,它就像一个魅力,我可以看到 json。如果我在前端使用 ajax 请求调用它,我会得到 p>
XMLHttpRequest cannot load https://www.linkedin.com/uas/oauth2/authorization?blablabla No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://foo.bar' is therefore not allowed access.
异常。
有什么想法吗?
编辑: 在查看了可能的解决方案之后,我缩小了问题范围并或多或少地解决了它。 问题不在于我无法从自己的 api 访问 json 文件,问题在于我在 ajax 调用中进行了重定向。
public function authorize(){
return Redirect::away("https://www.linkedin.com/uas/oauth2/authorization?response_type=linkedinApiData&redirect_uri=http://foo.bar/api/members/authenticated");
}
我在想,如果这重定向到另一个 api 调用,完成授权并返回一个 json 对象,那就没问题了,但后来我得到了前面提到的异常(我猜来自 linkedin)。
我有一个临时解决方案,只需使用 http://foo.bar/api/..>,它处理身份验证请求,进行重定向,最后重定向到我必须去的页面,并将结果 json 存储在 session 中。 当下一页加载时,我要求后端返回此 session 的内容。
是否可以通过身份验证(包含 linkedin 身份验证所需的重定向)进行发布,然后从我自己的服务器返回 json(可以正常工作并且不存在访问 header 问题?
最佳答案
域名只是源站的一部分。整个起源:
- 方案
- 完整的主机名
- 端口
…必须匹配。
foo.bar
与 www.foo.bar
不同。
要么与您使用的主机名保持一致(一般来说,将所有请求从 example.com
重定向到 www.example.com
或反之亦然是个好主意)或实现 circumvent the same origin policy 的方法之一.
关于javascript - 客户端服务器从自己的域返回 json 时没有 'Access-Control-Allow-Origin',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23580772/