2011-05-18 26 views
5
Ben birkaç gün ASP.NET benim google app motor uygulamasına giriş yapmak denedim

, ancak hiçbir şans google için giriş. Aşağıdaki makaleleri okudum ve temel fikirleri aldım. Ama hiçbir şey benim için işe yaramıyor. 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-appProgramlı uygulama motor C#

http://dalelane.co.uk/blog/?p=894
http://code.activestate.com/recipes/577217-routines-for-programmatically-authenticating-with-/ http://dalelane.co.uk/blog/?p=303

ne yapacağımı biliyorum. 1) ClientLogin'den bir auth jetonu alın. 2) Google App Engine'den bir çerez alın. 3) Gönder çerezi (Evet, veri göndermek İkinci bölümde sonra yönlendirmez istiyorum) ile benim uygulamasına veri. Ama üçüncü bölümü tüm benim için çalışmaz. Bana 403 hatası veriyor. İşte benim kodudur:

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; 
} 

Benim app.yaml şöyle görünür:

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

Ben çalıştığını, GET için yöntem POST değiştirirseniz. Verileri nasıl gönderebileceğimi söyleyen var mı?
Teşekkürler. DÜZENLENMİŞ

:
Hala şanslar. App.yaml dosyasında [login: required] olarak değiştirerek, app.yaml'ye [güvenli: her zaman] ekleyerek ve https'e istek protokolünü değiştirerek, parametreyi/_ah/login öğesine eklemeye devam etmenin çeşitli yollarını denedim. onları işe yaramaz :(POST. GET ama hiç bir fikir neden çalışmıyor
tamamen fikrin yok mu?

cevap

3

ben. Ben yanlış yolda olduğunu yaptı. bu uygulamanın sorun değildi Django-nonrel'i google uygulama motorunda kullanıyorum ve işleyicime @ csrf_exempt dekoratörünü eklemeyi unutmuşum.Aynı problemi daha önce ama yine de vardı.Neyse, yukarıdaki kod görünüşte düzgün çalışıyor başında beri. ne akıllı çocuk :)