2016-08-08 106 views
1

Ich versuche, ein access_token von Google in einer Titanium-Anwendung zu erhalten, um auf die Google+ API zuzugreifen. Ich habe einen Android Oauth2.0-Client in der Google API Console registriert, so habe ich eine Client-ID und ein paar Redirect Uris von Google generiert: ["urn: ietf: wg: oauth: 2.0: oob", "http://localhost"]. Ich versuche, den Autorisierungscode Fluss zu folgen, so habe ich eine Berechtigungsanforderung an den Endpunkt „https://accounts.google.com/o/oauth2/v2/auth“ mit den folgenden Parametern als Query-Strings gemacht:Google API OAuth 2.0 Titanium: Erforderlicher Parameter fehlt: response_type

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" 

Dann ich eine Webansicht erstellen und auf die Autorisierungs Endpunkt umleiten mit den appendend Query Strings. Der Google Login-Bildschirm wird geöffnet und ich kann mich anmelden und den Zugriff auf die Anwendung gewähren. Im Gegenzug erhalte ich eine URL mit dem Autorisierungscode, den ich extrahieren kann, um ihn für den nächsten Anruf zu verwenden.

Um den access_token zu erhalten, mache ich eine POST-Anfrage an "https://accounts.google.com/o/oauth2/v2/auth" Endpunkt. Dies ist die Funktion:

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); 


} 

Aber ich habe den Statuscode 400 mit der folgenden Meldung: „Erforderliche Parameter fehlt: response_type“.

Ich bin mir nicht sicher, warum ich das bekomme, da von OAuth 2.0 specification die erforderlichen Parameter für die Zugriffstokenanforderung nur Grant_type, Code, Client_id und Redirect_uri sind. Ich habe auch versucht, response_type = "token" hinzuzufügen, aber das sollte für den impliziten Fluss sein, wenn ich es richtig verstehe.

Irgendwelche Ratschläge?

Antwort

0

Es scheint, ich habe das Problem gefunden, der Endpunkt für den Token-Austausch ist nicht korrekt. Es sollte "https://accounts.google.com/o/oauth2/token" sein, zumindest funktionierte dieser für mich.

Ich möchte darauf hinweisen, dass in der neuesten Dokumentation von Google der Endpunkt für den Tokenaustausch lautet: "https://accounts.google.com/o/oauth2/v2/token", aber aus irgendeinem Grund funktioniert es nicht für mich (die Antwort sagt, dass die URL nicht unterstützt wird der Server). Ich hoffe, dies kann Menschen mit ähnlichen Problemen helfen.