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?