Access-Control-Allow-Origin不允许使用的URL

时间:2013-05-12 16:58:36

标签: ajax jquery flickr

我正在尝试实现OAUTH以访问Flickr API。我对flickr.com的AJAX调用一直失败。

示例错误消息:

XMLHttpRequest cannot load http://www.flickr.com/services/oauth        /request_token?oauth_callback=oob&oauth…signature_method=HMAC-SHA1&oauth_timestamp=1368375405647&oauth_version=1.0. Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin. 

最初我使用chrome并将html文件作为file:// path读取。我曾经得到错误'null-access-control-allow-origin不允许'。我通过将html文件复制到“本地IIS服务器”,“本地python web服务器”,然后是“远程网络服务器”来解决了这个问题。我用>创建了python web服务器python -m http.server 8080'

我意识到我使用XMLHttpRequest对flickr.com的跨浏览器调用失败了。我试过这个论坛中建议的各种解决方案:

  1. 使用较新的Chrome 26.0.1410.64 m,我猜这是支持CORS
  2. 我使用--disable-web-security
  3. 启动了chrome
  4. 我在本地计算机上使用python -m http.server 8080创建了一个Web服务器,然后在远程计算机上创建了一个Web服务器并将html文件复制到该站点
  5. 我将文件复制到本地MSFT IIS服务器
  6. 我在etc / hosts文件中定义了URL以避免数字IP
  7. 我仍然收到相同的错误(错误消息中包含相关网址)

    代码剪辑:

    urlString="http://www.flickr.com/services/oauth/request_token?"+
            "oauth_callback="+"oob"+'&'+
            "oauth_consumer_key="+consumerKey+'&'+
            "oauth_nonce="+nonce+'&'+
            "oauth_signature="+esignature+'&'+
        "oauth_signature_method="+macAlgorithm+'&'+
            "oauth_timestamp="+timeStamp+'&'+
            "oauth_version=1.0";
    
    
    $.ajax({
       url: urlString,
       success:function(data){
        alert(data);
      }
    });
    

2 个答案:

答案 0 :(得分:2)

为了CORS工作,两端必须启用它。

第一个结尾是浏览器,当您使用Chrome 26. *时,您可以。

第二端是服务器

在向域名不同的域发出GET请求之前,浏览器会向该域发送OPTIONS请求。为响应此请求,服务器应包含一些标头,以指示是否允许跨域请求(GETPOST或其他)。

其中一个标题是Access-Control-Allow-Origin

因此,当您从文件系统(file://“协议”)运行页面时,OPTIONS表示类似“Flickr,我可以对您进行跨域调用吗?我正在拨打null。 Flickr无法将该域识别为允许并返回您获得的错误。

同样,当您从本地服务器运行页面时,OPTIONS“(...)我正在调用localhost:8080。 Flickr也不承认该域名是允许的。

解决方案:

我不知道Flickr oauth服务,但我知道,与任何其他服务一样,要对其进行CORS调用,该页面必须位于其允许的域中。从您的测试来看,我猜测Flickr不允许其他许多域名。

但...... CORS的另一种选择是JSONP。我做了一点研究,Flickr oauth似乎支持它。

查看此页面了解详情:http://www.flickr.com/services/api/explore/flickr.auth.oauth.getAccessToken 还有另一个问题在谈论这个具体主题: Is JSONP supported in the new Flickr OAuth API?

关于JSONP,这可以帮助您入门:How to make a JSONP request from Javascript without JQuery?

答案 1 :(得分:0)

在没有任何服务器端脚本的情况下,无法通过javascript实现Oauth 1.0。由于flickr的新身份验证过程基于Oauth 1.0a。你必须使用服务器端脚本。

我尝试使用带有CORS的FireFox中的JSONP发送令牌请求(使用第三方插件)并且它运行正常。但是没有使用任何附加组件,因为flickr的响应是文本格式(不是JSON格式)并且请求失败,所以不可能。

您可以使用服务器端代码进行令牌请求。或使用已弃用的flickr API进行身份验证。