NetworkError: 405方法不允许通过Google Api获取用户信息



我正在尝试获取这里描述的用户配置信息:http://code.google.com/intl/es-ES/apis/accounts/docs/OAuth2Login.html

但是我得到这个错误:

"NetworkError: 405 Method Not Allowed - 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);

希望有人能帮忙,提前谢谢

您遇到了跨域资源共享(CORS)协议。Mozilla对CORS有一个很好的介绍。您正在进行跨域XHR,为了使调用成功,您需要做一个小的更改,或者通过您自己的服务器代理请求来解决这个问题。

也就是说,我相信在谷歌的"实验"服务中有一个错误,在他们修复之前,你将无法让这个工作。此外,IE9及更早版本不支持CORS;IE10计划这样做。

服务器不允许的HTTP方法是OPTIONS方法。怎么回事?指定了HTTP GET,对吧?是的,你说了。然而,CORS协议要求浏览器在某些条件下"预先处理"请求。为了进行预飞行,浏览器向URL发送一个OPTIONS请求,以查看服务器是否允许您发出GET请求。在这种情况下,你的道场。xhrGet调用,在你的背后,正在添加一个"X-Requested-With: XMLHTTPRequest"头到你的请求。发送像X-Requested-With这样的非标准报头是触发预飞行的"特定条件"之一。

幸运的是,您可以通过添加 来抑制该头信息。
headers:{'X-Requested-With': null},

到xhrArgs参数

这样做之后,您将发送一个有效的CORS请求。然而,就我今天的经验来看,Google并没有正确地尊重CORS请求。在Google的API控制台的"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。

以我为例,因为我几个小时前才创建了一个应用程序,也许谷歌还没有向系统传播"允许的起源"信息;也许这个电话明天能起作用。或者,这只是这个实验性功能的一个bug。

解决方法:我只是让我的nginx服务器代理请求到谷歌。

   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(...)

听起来您要么没有成功地进行身份验证,要么没有在access_token中传递正确的信息。如果您显示如何获得access_token,并给出您正在传递的访问令牌的形式,例如16位十六进制数字,可能会有所帮助。或以100字符为基数的64字符串。

我也不熟悉dojo的例子显示添加access_token到url而不是请求的主体与get dojo添加内容作为url参数?

相关内容

  • 没有找到相关文章

最新更新