【问题标题】:NetworkError: 405 Method Not Allowed to get user info via Google ApiNetworkError: 405 Method Not Allowed to get user info via Google Api
【发布时间】:2012-01-08 04:16:58
【问题描述】:

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

希望有人能帮忙,在此先感谢

【问题讨论】:

    标签: oauth google-api oauth-2.0 userinfo


    【解决方案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 请求。然而,根据我今天的经验,谷歌并没有正确地满足 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。

    就我而言,由于我几小时前刚刚创建了一个应用程序,可能 Google 尚未将“允许的来源”信息传播到系统;可能这个电话明天会起作用。或者,这只是这个实验性功能中的一个错误。

    解决方法:我只是让我的 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(...)
    

    【讨论】:

      【解决方案2】:

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

      另外我不熟悉dojo,示例显示将access_token添加到url而不是使用get的请求正文dojo是否将内容添加为url参数?

      【讨论】:

        猜你喜欢
        • 2011-11-17
        • 2013-11-09
        • 2016-08-08
        • 2011-09-25
        • 2017-09-30
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 2016-04-12
        相关资源
        最近更新 更多