我正在尝试实现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的跨浏览器调用失败了。我试过这个论坛中建议的各种解决方案:
我仍然收到相同的错误(错误消息中包含相关网址)
代码剪辑:
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);
}
});
答案 0 :(得分:2)
为了CORS工作,两端必须启用它。
第一个结尾是浏览器,当您使用Chrome 26. *时,您可以。
第二端是服务器:
在向域名不同的域发出GET
请求之前,浏览器会向该域发送OPTIONS
请求。为响应此请求,服务器应包含一些标头,以指示是否允许跨域请求(GET
,POST
或其他)。
其中一个标题是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进行身份验证。