2012-08-06 24 views
11

Sto usando C# (ASP.NET). Voglio utilizzare Google oauth per accedere ai dettagli del profilo utente nella mia app. Ho ottenuto con successo il codice di autorizzazione ma ho avuto problemi nell'ottenere il token di accesso. Preferisco lo Google tutorials. Nel tutorial, ho letto che devo inviare la richiesta e ottenere la risposta da google. Per quello io uso System.Net.HttpWebRequest/HttpWebResponse (sto andando nel modo giusto). Io uso questo codice ....Come ottenere il token di accesso per google oauth?

byte[] buffer = Encoding.ASCII.GetBytes("?code=" + code + "&client_id=xxx&client_secret=xxx&redirect_uri=xxxx&grant_type=authorization_code"); 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://accounts.google.com"); 
req.Method = "POST"; 
req.ContentType = "application/x-www-form-urlencoded"; 
req.ContentLength = buffer.Length; 

Stream strm = req.GetRequestStream(); 
strm.Write(buffer, 0, buffer.Length); 
strm.Close(); 

HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
Response.Write(((HttpWebResponse)resp).StatusDescription); 

Ma, ho ottenuto l'errore:

The remote server returned an error: (405) Method Not Allowed.

Aggiornamento: Qui variabile code è il codice di autorizzazione.

+1

Perché non utilizzare https://code.google.com/p/google-api-dotnet-client/wiki/OAuth2 – user854301

+0

@ user854301 posso fare riferimento questo, ma ho voluto sapere che l'uso di 'HttpWebRequest/Response' è corretto o no? Posso inviare la richiesta a google da 'HttpWebRequest'. – Sagar

+0

Che cos'è il "codice" nel buffer? – Apoorva

risposta

8

penso che si sta inviando la richiesta POST all'endpoint sbagliata, quella corretta è https://accounts.google.com/o/oauth2/token

+2

Io uso questo, ma mi mostra altro errore. Ora l'errore è "Il server remoto ha restituito un errore: (400) Richiesta errata. Dove sto andando male? – Sagar

+0

Analizza nei dettagli l'eccezione, il messaggio di errore completo ti dirà cosa c'è di sbagliato nella tua richiesta –

4

Come ho avuto problemi simili nel processo di implementazione di Google autenticazione, mi post il codice che funziona .. L'ultima problema menzionato: errore (400) La cattiva richiesta potrebbe essere causata dal comando '?' nel codice sopra ..

string codeClient = "code="+ t +"&client_id=number.apps.googleusercontent.com&"; 
string secretUri = "client_secret=yoursecret&" + "redirect_uri=path&" 
     + "grant_type=authorization_code"; 
postString = codeClient + secretUri; 

string url = "https://accounts.google.com/o/oauth2/token"; 

HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url.ToString()); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 

UTF8Encoding utfenc = new UTF8Encoding(); 
byte[] bytes = utfenc.GetBytes(postString); 
Stream os = null; 
try 
{ 
     request.ContentLength = bytes.Length; 
     os = request.GetRequestStream(); 
     os.Write(bytes, 0, bytes.Length); 
} 
catch 
{ } 

try 
{ 
     HttpWebResponse webResponse = (HttpWebResponse) request.GetResponse(); 
     Stream responseStream = webResponse.GetResponseStream(); 
     StreamReader responseStreamReader = new StreamReader(responseStream); 
     result = responseStreamReader.ReadToEnd();//parse token from result 
+0

cosa è "t" usato per il codice..e come ottenerlo .. –

+0

t il codice di autorizzazione iniziale ... –

+0

Ancora dice Bad Request con questo codice anche –

2

Il mio codice funziona, ho commesso degli errori in due righe sopra. Dovrebbe essere così

byte[] buffer = Encoding.ASCII.GetBytes("code=" + code + "&client_id=xxx&client_secret=xxx&redirect_uri=xxxx&grant_type=authorization_code"); 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token"); 

Il codice rimanente è corretto.

+2

Qual è la variabile Code nel tuo codice .. –

+0

@Viktor: noto il tuo ** id cliente ** e ** client secret ** sono entrambi inclusi nel buffer. Il mio sito web ospitato non ha SSL. Sai se Google accetterà la mia richiesta web da una connessione non SSL? Ovviamente, non sarebbe sicuro, e qualcuno potrebbe cinguettare le mie credenziali, ma non so come aggirarlo. – jp2code

0

La richiesta originale sembra essere un po 'obsoleta. Ma ho scoperto che gli esempi di codice di Google contengono un sacco di codice di gestione delle "pratiche ottimali" che è difficile separare dalle operazioni essenziali.

Recentemente ho pubblicato un documento che rappresenta tutte le operazioni di REST come comandi di arricciatura. È difficile essere esperti in ogni lingua, ma il ricciolo sembra universale. La maggior parte delle persone lo sa, altrimenti è abbastanza facile da capire. Nei miei esempi di arricciatura, il flag -d indica un'operazione POST. Altrimenti, i parametri vengono aggiunti all'URL.

http://www.tqis.com/eloquency/googlecalendar.htm

0
public string ReceiveTokenGmail(string code, string GoogleWebAppClientID, string GoogleWebAppClientSecret, string RedirectUrl) 
{ 
    string postString = "code=" + code + "&client_id=" + GoogleWebAppClientID + @"&client_secret=" + GoogleWebAppClientSecret + "&redirect_uri=" + RedirectUrl; 

    string url = "https://accounts.google.com/o/oauth2/token"; 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url.ToString()); 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 

    UTF8Encoding utfenc = new UTF8Encoding(); 
    byte[] bytes = utfenc.GetBytes(postString); 
    Stream os = null; 
    try 
    { 
     request.ContentLength = bytes.Length; 
     os = request.GetRequestStream(); 
     os.Write(bytes, 0, bytes.Length); 
    } 
    catch 
    { } 
    string result = ""; 

    HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); 
    Stream responseStream = webResponse.GetResponseStream(); 
    StreamReader responseStreamReader = new StreamReader(responseStream); 
    result = responseStreamReader.ReadToEnd(); 

    return result; 
} 
+0

come ottengo il codice di autenticazione da google ?. Volevo usare il tuo codice in modo da non dover usare il file key.json e utilizzare semplicemente una configurazione app per il mio ID client e il segreto del client. Se potessi condividere come ottenere il codice di autorizzazione, sarebbe fantastico. – CyberNinja

Problemi correlati