5

数日間、ASP.NET から Google アプリ エンジン アプリケーションにログインしようとしましたが、うまくいきません。以下の記事を読み、基本的な考え方を理解しました。しかし、私には何もうまくいきません。
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- Android アプリからのアプリ エンジン

私は何をすべきか知っています。1) ClientLogin から認証トークンを取得します。2) Google App Engine から Cookie を取得します。3) Cookie を使用してアプリにデータを投稿します (はい、データを投稿したいのですが、2 番目の部分の後にリダイレクトするのではありません)。しかし、3番目の部分はまったく機能しません。それは私に403エラーを与えます。これが私のコードです:

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=test@gmail.com&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;
}

私の app.yaml は次のようになります。

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

メソッド POST を GET に変更すると、うまくいきます。データを投稿する方法を誰か教えてもらえますか?
ありがとう。

EDITED:
まだ運がありません。app.yaml で [login: required] に変更する、app.yaml に [secure: always] を追加する、リクエスト プロトコルを https に変更する、continue パラメータを /_ah/login に追加するなど、いくつかの方法を試しましたが、すべてそれらは機能しません:(
POSTがGET以外にまったく機能しない理由がまったくわかりません。何かアイデアはありますか?

4

1 に答える 1

3

やった。私は間違った方向に進んでいました。それはアプリエンジンの問題ではなく、Djangoの問題でした。Google App EngineでDjango-nonrelを使用していますが、ハンドラーに@csrf_exemptデコレーターを配置するのを完全に忘れていました。以前も同じ問題がありましたが、もう一度。とにかく、上記のコードは最初から明らかに正しく機能しています。なんて賢い少年:)

于 2011-05-18T07:05:24.770 に答える