当前位置: 首页 > 知识库问答 >
问题:

Google API OAuth 2.0 Titanium:缺少必需参数:response_type

仲学真
2023-03-14

我正在尝试在Titanium应用程序中从Google获取access_token以访问Google API。我在Google API控制台中注册了一个Android Oauth2.0客户端,因此我有一个客户端ID和两个由Google生成的重定向uri:[“urn:ietf:wg:oauth:2.0:oob”,“http://localhost“]。我正在尝试遵循授权代码流,因此我向endpoint发出了授权请求”https://accounts.google.com/o/oauth2/v2/auth“使用以下参数作为查询字符串

client_id = encodeURI(<app id>)
redirect_uri = encodeURI("urn:ietf:wg:oauth:2.0:oob")
response_type = "code",
state = <random generated number>
scope = "https://www.googleapis.com/auth/plus.me"

然后,我创建了一个webview,并使用appendend查询字符串重定向到授权endpoint。谷歌登录屏幕打开,我可以登录并授予访问该应用程序的权限。作为回报,我得到了一个嵌入了授权代码的url,我可以提取它以用于下一次调用。

为了获得access_token我向“https://accounts.google.com/o/oauth2/v2/auth”endpoint发出POST请求。这是函数:

function getAccessToken(code) {

Ti.API.warn("Authorization code: " + code);
    
var auth_data = {
    code : code,
    client_id : client_id,
    redirect_uri : redirect_uri,
    grant_type : "authorization_code",
};


var client = Ti.Network.createHTTPClient({
    
    onload: function() {
        var response_data = JSON.parse(this.responseText);
        var access_token = response_data["access_token"];
        var expires_in = response_data["expires_in"];
    },
    
    
    onerror: function() {
        Ti.API.error("HTTPClient: an error occurred.");
        Ti.API.error(this.responseText);
    }
    
});

var body = "";
    
for (var key in auth_data) {
    if (body.length) {
        body += "&";
    }
    body += key + "=";
    body += encodeURIComponent(auth_data[key]);
}

client.open("POST", "https://accounts.google.com/o/oauth2/v2/auth");
client.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
client.send(body);


}

但是我得到了一个状态代码400,并显示如下消息:“缺少必需的参数:response_type”。

我不知道为什么会这样,因为从OAuth 2.0规范来看,访问令牌请求所需的参数只有grant_type、code、client_id和redirect_uri。我还尝试添加response_type=“token”,但如果我理解正确的话,这应该是针对隐式流的。

有什么建议吗?

共有2个答案

朱起运
2023-03-14

我也遇到过同样的问题,留档没有提到正确的URL。但是我注意到,当你注册客户端时,包含client_id和client_secret的JSON结果文件也包含auth_uri和token_uri。

希望这能帮到某个人:)

阎涵容
2023-03-14

似乎我发现了问题,令牌交换的endpoint不正确。应该是“https://accounts.google.com/o/oauth2/token“,至少这个对我有用。

我要指出,在Google的最新文档中,令牌交换的endpoint是:“https://accounts.google.com/o/oauth2/v2/token“但由于某些原因,它对我不起作用(响应说服务器不支持该url)。希望这能帮助有类似问题的人。

 类似资料:
  • 问题内容: 我有一个重写版本discord.py。如果消息中包含内容,则不会发生错误。如果消息中内容不存在,则我希望该错误不会发生。 我的代码: 完整回溯: 问题答案: 命令解析参数的方式意味着定义 表示需要单词作为命令调用的一部分。如果您想捕获消息的其余部分,则可以使用仅关键字参数语法: 此功能在此处记录。

  • 在我的MEAN Stack应用程序中使用(可在此处找到:https://github.com/jaredhanson/passport-google-oauth)。当我运行应用程序并尝试使用Google API登录时,将返回此错误 错误:invalid_request 请求详细信息scope=https://www.googleapis.com/auth/plus.login response_t

  • 问题内容: 我正在开发一个游戏作为附带项目,很有趣,但是遇到了这个错误,我真的不知道为什么会发生… 这是代码: 我这样称呼它: 我得到的错误是: 有任何想法吗? 问题答案: 您不应直接调用类方法,而应创建该类的实例: 要详细说明该错误,您将得到: TypeError:turn()缺少1个必需的位置参数:“ playerImages” 这是因为需要第一个参数()的实例。类方法总是将实例作为第一个参数

  • 我无法通过错误: 我检查了几个教程,但似乎没有什么不同于我的代码。我唯一能想到的是Python3.3需要不同的语法。 如果我理解正确,会自动传递给构造函数和方法。我做错了什么?

  • 问题内容: 我是python新手,碰壁了。我遵循了一些教程,但无法克服错误: 我检查了一些教程,但似乎与我的代码没有什么不同。我唯一能想到的是python 3.3需要不同的语法。 主要技巧: 泵类: 如果我正确理解,“自我”将自动传递给构造函数和方法。我在这里做错了什么? 我正在将Windows 8与python 3.3.2一起使用 问题答案: 你需要在此处实例化一个类实例。 采用 小例子

  • 我尝试在谷歌中找到解决方案,但谷歌中的所有解决方案都不适合我,也许在这里我得到了正确的答案。 我有以下代码: 我得到了这个错误: 回溯(最后一次调用):文件“位置文件”,第42行,在g=gui_main()文件“位置文件”的第26行,在init btn_next=按钮(self.win_about,text=“next”,fg=“red”,command=gui_main.screen_menu(