我正在尝试从Titanium应用程序中获取Google的access_token以访问Google+ API。 我在Google API Console注册了一个Android Oauth2.0客户端 所以我有一个客户端ID和几个由Google生成的重定向uris:[“urn:ietf:wg:oauth:2.0:oob”,“http://localhost”]。 我正在尝试遵循授权代码流,所以我已经使用以下参数作为查询字符串向端点“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查询字符串重定向到授权端点。谷歌登录屏幕打开,我可以登录并授予对该应用程序的访问权限。作为回报,我得到一个嵌入了授权码的网址,我可以提取该网址以用于下一次通话。
要获取access_token,我向“https://accounts.google.com/o/oauth2/v2/auth”端点发出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 specification访问令牌请求所需的参数只是grant_type,code,client_id和redirect_uri。我还尝试添加response_type =“token”,但如果我理解正确,那应该是隐式流程。
有什么建议吗?
答案 0 :(得分:1)
我也遇到了同样的问题,documentation没有提到正确的URL。 但是我注意到,当您注册客户端时,包含client_id和client_secret的JSON结果文件也包含auth_uri和token_uri。
我希望这会对某人有所帮助:)
答案 1 :(得分:0)
似乎我发现了问题,令牌交换的端点不正确。 它应该是&#34; https://accounts.google.com/o/oauth2/token&#34;,至少这个对我有用。
我想指出,在Google的最新文档中,令牌交换的端点是这样的:&#34; https://accounts.google.com/o/oauth2/v2/token&#34;但由于某些原因它对我不起作用(响应说服务器不支持url)。希望这可以帮助有类似问题的人。