2011-05-18 7 views
5

Intenté iniciar sesión en la aplicación del motor de mi aplicación de Google desde ASP.NET durante unos días, pero no tuve suerte. He leído los siguientes artículos y tengo las ideas básicas. Pero nada funciona para mi
http://code.activestate.com/recipes/577217-routines-for-programmatically-authenticating-with-/ http://dalelane.co.uk/blog/?p=303
http://dalelane.co.uk/blog/?p=894
http://krasserm.blogspot.com/2010/01/accessing-security-enabled-google-app.html http://blog.notdot.net/2010/05/Authenticating-against-App-Engine-from-an-Android-appIniciar sesión programáticamente en el motor de la aplicación de Google C#

sé qué hacer. 1) Obtenga un token de autenticación de ClientLogin. 2) Obtenga una cookie de Google App Engine. 3) Publique datos en mi aplicación con la cookie (Sí, deseo publicar datos, no redirigirlos después de la segunda parte). Pero la tercera parte no funciona para mí en absoluto. Me da error 403. Aquí está mi código:

void PostToGAE() 
{ 
    var auth = GetAuth(); // I can get the authtoken 
    var cookies = GetCookies(auth); // I can get the ACSID cookie 

    var url = string.Format("http://test.appspot.com/do/something/"); 
    var content = "testvalue=test"; 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.KeepAlive = false; 
    request.CookieContainer = cookies; 
    byte[] byteArray = Encoding.UTF8.GetBytes(content); 
    request.ContentLength = byteArray.Length; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Method = "POST"; 
    Stream dataStream = request.GetRequestStream(); 
    dataStream.Write(byteArray, 0, byteArray.Length); 
    dataStream.Close(); 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // This gives me 403 
    Stream stream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(stream); 
    string result = reader.ReadToEnd(); 
    reader.Close(); 
} 

CookieContainer GetCookies(string auth) 
{ 
    CookieContainer cookies = new CookieContainer(); 
    var url = string.Format("http://test.appspot.com/_ah/login?auth={0}", 
          System.Web.HttpUtility.UrlEncode(auth)); 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.AllowAutoRedirect = false; 
    request.CookieContainer = cookies; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Method = "GET"; 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Stream stream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(stream); 
    string result = reader.ReadToEnd(); 
    reader.Close(); 
    return cookies; 
} 

string GetAuth() 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com/accounts/ClientLogin"); 
    var content = "[email protected]&Passwd=testpass&service=ah&accountType=HOSTED_OR_GOOGLE"; 
    byte[] byteArray = Encoding.UTF8.GetBytes(content); 
    request.ContentLength = byteArray.Length; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Method = "POST"; 
    Stream dataStream = request.GetRequestStream(); 
    dataStream.Write(byteArray, 0, byteArray.Length); 
    dataStream.Close(); 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Stream stream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(stream); 
    string loginStuff = reader.ReadToEnd(); 
    reader.Close(); 

    var auth = loginStuff.Substring(loginStuff.IndexOf("Auth")).Replace("Auth=", "").TrimEnd('\n'); 
    return auth; 
} 

Mi app.yaml se ve así:

- url: /do/something/ 
    script: something.py 
    login: admin 

Si cambio el método POST a GET, que funciona. ¿Alguien podría decirme cómo puedo publicar datos?
Gracias.

EDITADO:
Todavía no hubo suerte. He intentado de varias maneras, como cambiar a [login: required] en app.yaml, agregar [secure: always] a app.yaml y cambiar el protocolo de solicitud a https, agregar el parámetro continue a/_ah/login, pero todos ellos no funcionan :(
No tengo ni idea por qué POST no funciona en absoluto, pero CONSIGUE. ¿Alguna idea?

Respuesta

3

Lo hice. Estaba en el camino equivocado. Ese no era el problema de la aplicación motor pero Django. Estoy usando Django-nonrel en el motor de la aplicación google, y olvidé por completo poner @csrf_exempt decorador en mi controlador. Tuve el mismo problema antes, pero de nuevo. De todos modos, el código anterior aparentemente ha estado funcionando correctamente desde el principio. Qué chico inteligente :)

Cuestiones relacionadas