2015-03-01 22 views
6

Sto tentando di scambiare un codice di autorizzazione Google Plus una tantum per un token di accesso. Ma continuo a ricevere una 400 Bad Request. Sto usando VB.NET. Ecco il codice:Endpoint token API Google Il POST restituisce Bad Request 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 

Sono abbastanza sicuro che questo è il punto finale che dovrei essere usando https://www.googleapis.com/oauth2/v3/token ma chi lo sa? Il Google Discovery Document mi confonde solo questo.

Anche perdonare la mia ingenuità ma qualcuno potrebbe spiegare come il codice POST che Google utilizza come esempio si riferisce alla richiesta Web nel mio codice sopra? Penso di capire come traducono i valori, ma le 3 linee di intestazione nel POST (sotto) ... come viene specificato nel codice VB? Mi manca qualcosa che deve essere evidente agli altri, quindi se lo sai, per favore dimmelo.

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 

Un'altra Stack Overflow Post dice qualcosa circa l'invio dei dati come parametri di query (usando '&' credo) invece di inviare i dati come intestazioni di richiesta, è così c'è qualcosa di sbagliato con l'invio di un lungo NameValueCollection?

+0

Il tuo redirect_uri corrisponde al valore utilizzato per ottenere il codice di autorizzazione? –

+0

In base alla risposta restituita dal POST, ottengo un uri_redirect_mismatch, quindi hai ragione. Ma ho copiato e incollato l'URL direttamente dalla Developer Console nel mio codice e viceversa, quindi sono in perdita sul perché questo sta accadendo. –

risposta

4

Quindi ecco la risposta: l'API richiede 2 chiamate. La prima chiamata restituisce un codice di autorizzazione una tantum. La prima chiamata deve specificare un URI di reindirizzamento.

La seconda chiamata invia un codice temporale all'API per un token di autorizzazione. Questo POST richiede anche un URI di reindirizzamento.

L'URI di reindirizzamento nella prima chiamata deve essere uguale all'URI di reindirizzamento nella seconda chiamata !!!

Impossibile trovare questo ovunque nella documentazione. Ricorda che questo URI deve anche corrispondere a uno degli URI nell'elenco nella tua console degli sviluppatori, che è quello che dice tutta la documentazione.

+0

sì, sarebbe stato carino se lo avessero menzionato nei documenti. grazie per aver postato questo ... –