我正在尝试获取此处描述的用户个人资料信息:http://code.google.com/intl/es-ES/apis/accounts/docs/OAuth2Login.html
但是我收到了这个错误:
“NetworkError:405方法不允许 - https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=token”
使用Web服务器应用程序协议获取令牌:
这是我的代码:
var xhrArgs = {
url : "https://www.googleapis.com/oauth2/v1/userinfo?alt=json",
content : {
access_token : access_token
},
load : function(data) {
console.log(data);
},
error : function(error) {
console.log(error);
}
};
dojo.xhrGet(xhrArgs);
希望有人可以提供帮助,提前致谢
答案 0 :(得分:1)
您遇到了跨源资源共享(CORS)协议。 Mozilla has a nice intro to CORS。您正在制作跨域XHR,并且要使调用成功,您需要进行一些小的更改,或者通过您自己的服务器代理请求来解决此问题。
那就是说,我认为Google的“实验性”服务存在错误,在修复之前你将无法使用它。此外,IE9及更早版本不支持CORS; IE10计划这样做。
服务器不允许的HTTP方法是OPTIONS方法。嘿嘿?你指定了一个HTTP GET,对吗?是的,你做到了。但是,CORS协议要求浏览器在某些条件下“预检”请求。要进行预检,浏览器会向URL发送OPTIONS请求,以查看服务器是否允许您发出GET请求。在这种情况下,您的dojo.xhrGet调用正在为您的请求添加“X-Requested-With:XMLHTTPRequest”标头。发送像X-Requested-With这样的非标准标题是触发预检的“特定条件”之一。
幸运的是,您可以通过添加
来抑制该标题headers:{'X-Requested-With': null},
到你的xhrArgs参数。
执行此操作后,您将发送有效的CORS请求。但是,就我今天的经验而言,Google并未正确遵守CORS请求。 “API访问”选项卡上的Google API控制台中的“Web应用程序的客户端ID”下的设置之一是“JavaScript起源”。在这里列出原点,例如任何网页的https://example.com将发出其中一个跨源请求。以下是Chrome的错误报告:
XMLHttpRequest cannot load https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token={elided}.
Origin https://example.com is not allowed by Access-Control-Allow-Origin.
检查Google的响应标头显示他们根本不发送任何Access-Control-Allow-Origin。
就我而言,由于我刚刚在几个小时前创建了一个应用程序,谷歌还没有将“允许的来源”信息传播给系统;可能这个电话明天会工作。或者,这只是这个实验性功能中的一个错误。
解决方法:我只是让我的nginx服务器代理Google的请求。
location /userinfo {
proxy_pass https://www.googleapis.com/oauth2/v1/userinfo;
proxy_redirect default;
}
然后我将xhrGet发送到“/ userinfo”,一切正常。
dojo.xhrGet({
url: '/userinfo',
handleAs: 'json',
headers:{'X-Requested-With': null}, //superfluous now
content: {alt: 'json', access_token: params.access_token}
}).then(...)
答案 1 :(得分:0)
听起来您未成功通过身份验证,或者您未在access_token中传递正确的信息。如果您展示了如何获取access_token,并提供您正在传递的访问令牌的表单,这可能会有所帮助,例如: 16位十六进制数。或100个字符串64字符串。
此外,我不熟悉dojo,示例显示将access_token添加到url而不是请求的主体,并将do dojo添加内容作为url参数?