2012-08-06 40 views
11

Estoy usando C# (ASP.NET). Quiero utilizar Google oauth para acceder a los detalles del perfil de usuario en mi aplicación. Conseguí con éxito el código de autorización pero tuve problemas para obtener el token de acceso. Prefiero el Google tutorials. En el tutorial, leo que tengo que enviar la solicitud y obtener la respuesta de google. Para eso uso System.Net.HttpWebRequest/HttpWebResponse (voy de la manera correcta). Yo uso este código ....¿Cómo obtener el token de acceso para 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); 

Pero, tengo el error:

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

Actualización: Aquí la variable code es el código de autorización.

+1

¿Por qué no usar https://code.google.com/p/google-api-dotnet-client/wiki/OAuth2 – user854301

+0

@ user854301 puedo referir esto, pero yo quería saber que el uso de 'HttpWebRequest/Response' es correcto o no? ¿Puedo enviar la solicitud a google desde 'HttpWebRequest'. – Sagar

+0

¿Qué es "código" en tu buffer? – Apoorva

Respuesta

8

creo que va a enviar la solicitud POST al punto final del mal, la correcta es https://accounts.google.com/o/oauth2/token

+2

Lo uso, pero me muestra otro error. Ahora el error es 'El servidor remoto devolvió un error: (400) Solicitud incorrecta. ¿Dónde me estoy equivocando? – Sagar

+0

Profundice en los detalles de la excepción, el mensaje de error completo le dirá qué problema tiene su solicitud –

4

Como he tenido problemas similares en el proceso de implementación de Google de autenticación, voy a publicar el código que funciona .. La última problema mencionado: error (400) La solicitud incorrecta podría ser causada por el encabezado '?' en el código anterior ...

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

qué es "t" usada para el código ... y cómo obtenerlo ... –

+0

t el código de autorización inicial ... –

+0

Todavía dice Mal pedido con este código también –

2

Mi código está funcionando, he cometido errores en las dos líneas anteriores. Debe ser así

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

El código restante es correcto.

+2

Cuál es la variable Código en su código .. –

+0

@Viktor:. Me he dado cuenta que su ID de cliente ** ** y ** secreto de cliente ** están ambos incluidos en el búfer. Mi sitio web alojado no tiene SSL. ¿Sabe si Google va a aceptar mi solicitud web desde una conexión no SSL? Obviamente, no sería seguro, y alguien podría snipe mis credenciales, pero no sé una manera de evitarlo. – jp2code

0

La solicitud original parece estar un poco desactualizada. Pero descubrí que los ejemplos del código de Google contienen muchos códigos de limpieza de "mejores prácticas" que son difíciles de separar de las operaciones esenciales.

Recientemente publiqué un documento que representa todas las operaciones de REST como comandos curl. Es difícil estar familiarizado con todos los idiomas, pero curl parece universal. La mayoría de la gente lo sabe, de lo contrario, es bastante fácil de entender. En mis ejemplos de curl, la bandera -d indica una operación POST. De lo contrario, los parámetros se anexan a la 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

¿Cómo puedo obtener el código de autenticación de Google ?. Quería utilizar su código por lo que no tiene que utilizar el archivo key.json y sólo tiene que utilizar una aplicación de configuración para mi ID de cliente y el cliente secret.If podría compartir cómo obtener el código de autorización, que sería impresionante. – CyberNinja

Cuestiones relacionadas