0

我正在尝试实现 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。我曾经收到错误“访问控制允许来源不允许空值”。我通过将 html 文件复制到“本地 IIS 服务器”、“本地 python 网络服务器”和“远程网络服务器”来解决这个问题。我使用 > python -m http.server 8080' 创建了 python Web 服务器

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

  1. 使用较新的 Chrome 26.0.1410.64 m,我猜它支持 CORS
  2. 我用 --disable-web-security 启动了 chrome
  3. 我在本地机器上使用 python -m http.server 8080 创建了一个 Web 服务器,然后在远程机器上创建了一个 Web 服务器并将 html 文件复制到该站点
  4. 我将文件复制到本地 MSFT IIS 服务器
  5. 我在 etc/hosts 文件中定义了 URL 以避免数字 IP

我仍然收到相同的错误(错误消息中有相关的 URL)

代码剪辑:

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);
  }
});
4

2 回答 2

1

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

第一端是浏览器,并且,当您使用 Chrome 26.* 时,您的还可以。

第二端是服务器

GET向与页面所在的域不同的域发出请求之前,浏览器OPTIONS会向该域发送请求。为了响应此请求,服务器应包含一些标头,这些标头表明是否允许跨域请求(GETPOST其他)。

这些标题之一是Access-Control-Allow-Origin.

因此,当您从文件系统(file://“协议”)运行页面时,其OPTIONS含义类似于“Flickr,我可以对您进行跨域调用吗?我正在从null调用。Flickr 不会将该域识别为允许的,并返回您遇到的错误。

同样,当您从本地服务器运行页面时,会显示OPTIONS" (...) I'm call from localhost:8080"。Flickr 也不承认该域是允许的。

解决方案:

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

但是...... CORS 的替代方案是 JSONP。我做了一点研究,Flickr oauth 似乎支持它。

查看此页面了解详细信息:http://www.flickr.com/services/api/explore/flickr.auth.oauth.getAccessToken 还有一个问题是关于该特定主题 的:新的 Flickr OAuth API 是否支持 JSONP?

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

于 2013-05-12T17:35:50.167 回答
0

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

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

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

于 2014-01-09T08:55:00.693 回答