2015-03-01 12 views
6

Ich versuche, einen einmaligen Google Plus-Autorisierungscode für ein Zugriffstoken auszutauschen. Aber ich bekomme immer noch eine 400 Bad Request. Ich benutze VB.NET. Hier ist der Code:Google API-Token-Endpunkt-POST gibt ungültige Anforderung zurück 400

 'We should now have a "good" one-time authorization code stored in "code" 
    Using Client As New WebClient() 
     'Dim Client As New WebClient() 
     Dim values As New NameValueCollection() 
     Dim Resp 
     Dim responseString As String 

     values("code") = Request.QueryString("code") 
     values("client_id") = ConfigurationManager.AppSettings("google.clientid") 
     values("client_secret") = ConfigurationManager.AppSettings("google.clientsecret") 
     values("grant_type") = "authorization_code" 
     values("redirect_uri") = "http://localhost:3333/MyVacations/default.aspx" 
     Resp = Client.UploadValues("https://www.googleapis.com/oauth2/v3/token", values) 
     responseString = Encoding.Default.GetString(Resp) 
    End Using 

Ich bin mir ziemlich sicher, dass dies der Endpunkt ich soll mit https://www.googleapis.com/oauth2/v3/token werden, aber wer weiß? Das verwirrt das nur für mich.

Auch entschuldigen Sie meine Naivität, aber würde jemand erklären, wie der POST-Code, den Google als Beispiel verwendet, sich auf die Webanfrage in meinem obigen Code bezieht? Ich denke, ich verstehe, wie die Werte übersetzen, aber die 3 Kopfzeilen im POST (unten) ... wie wird dies im VB-Code angegeben? Ich vermisse etwas, das für andere wirklich offensichtlich sein muss. Wenn du es also weißt, bitte sag es mir.

POST /oauth2/v3/token HTTP/1.1 
Host: www.googleapis.com 
Content-Type: application/x-www-form-urlencoded 

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7& 
client_id=8819981768.apps.googleusercontent.com& 
client_secret={client_secret}& 
redirect_uri=https://oauth2-login-demo.appspot.com/code& 
grant_type=authorization_code 

Ein weiterer Stack Overflow Post sagt etwas über die Daten als Abfrageparameter zu senden (mit ‚&‘ Ich denke,) statt die Daten als Request-Header senden, so ist es etwas falsch entlang einer mit dem Senden von Namevaluecollection?

+0

Entspricht Ihr redirect_uri dem Wert, der zum Abrufen des Autorisierungscodes verwendet wurde? –

+0

Entsprechend der Antwort, die vom POST zurückgegeben wird, erhalte ich einen uri_redirect_mismatch, also sind Sie richtig. Aber ich habe die URL direkt von der Developer Console in meinen Code kopiert und eingefügt und umgekehrt, so dass ich nicht weiß, warum dies geschieht. –

Antwort

4

Also hier ist die Antwort: Die API erfordert 2 Anrufe. Der erste Aufruf gibt einen einmaligen Autorisierungscode zurück. Der erste Aufruf muss einen Weiterleitungs-URI angeben.

Der zweite Aufruf sendet den einen Zeitcode an die API für ein Autorisierungs-Token. Dieser POST erfordert auch einen Weiterleitungs-URI.

Der Weiterleitungs-URI im ersten Anruf muss mit dem Umleitungs-URI im zweiten Anruf identisch sein !!!

Ich konnte dies nirgendwo in der Dokumentation finden. Denken Sie daran, dass dieser URI auch mit einem der URIs in der Liste in Ihrer Entwicklerkonsole übereinstimmen muss, was in der gesamten Dokumentation steht.

+0

yeah, wäre schön gewesen, wenn sie das in der Dokumentation erwähnt hätten. Danke für das Posten ... –

Verwandte Themen