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

时间:2011-11-28 18:16:15

标签: oauth google-api oauth-2.0 userinfo

我正在尝试获取此处描述的用户个人资料信息: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);

希望有人可以提供帮助,提前致谢

2 个答案:

答案 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参数?