5

例http://tipfy-auth.appspot.com(ソースhttp://code.google.com/p/tipfy/source/browse/examples/auth/app/)のログインページを模倣しようとしています。成功せずに。ユーザーがページにリダイレクトされると、問題が発生するようです。現在のリクエストフローは次のようになります。

LoginPage(LoginHandler)-> Facebookリダイレクト(FacebookAuthHandler)302-> Facebook.com-> Facebookリダイレクト(FacebookAuthHandler)302-> SignupPage(SignupHandler)302-> LoginPage(LoginHandler)。

ここでの問題(私が理解した限り)は、サインアップ(エンドポイントである必要があります)からログインページへの最後の302(http-redirect)です。

いくつかの集中的なログ記録の後(これをローカルでテストするために見つけることができません)、Facebookから戻ったときにセッションが設定されているようです。セッションは、リクエストハンドラー(FacebookAuthHandler)のdictとして2つの場所self.auth.session(dict)とself.session(a SecureCookieSession)に保存されますが、SignupPageへのリダイレクト後self.auth.sessionはNoneです。

SignUpPageからLoginPageへのリダイレクトは、SignupHandler's getメソッドに、要求をここで処理するかリダイレクトするかを決定するデコレータ@login_requiredがあるために発生します。self.auth.session

では、なぜself.sessionが保持されているのに、リクエスト間でself.auth.sessionが保持されないのでしょうか。self.auth.sessionリクエストごとに設定されていますか?セッションはどのように保存されますか?それがデータベースにある場合、データストアのタイプは重要ですか(マスター/スレーブまたは高レプリケーション)。

ソースコードを調べていますが、役立つものが見つかりません。

..fredrik

編集

以下に回答を投稿しました。

4

1 に答える 1

1

問題がSessionAuthStoreクラスのセッションプロパティ内にあることに絞り込みました。

セッションプロパティ(これは@login_requiredがユーザーをリダイレクトするかどうかを決定するために調べるプロパティです)にアクセスするとき、次のコードを実行します(tipfy.auth.SessionAuthStore内):

if not self.loaded:
    self._load_session_and_user()

return self._session

ここでの問題は、_load_session_and_userメソッドで、セッション内の「トークン」キーに基づいてデータストアからユーザーをロードできることを期待していることです。

残念ながら、Facebookから戻るときはユーザーがいません。そのため、失敗してユーザーをログインページにリダイレクトします。

プロジェクトを進めるために、コードを少し変更しました。@ login_required(tipfy.auth.init.py)

if not auth.session:
        auth._load_session() # If no session try to load it from the _session_base

    if not auth.session:
        return handler.redirect(auth.login_url())

そして、MultiAuthStoreクラスの新しいメソッド。

def _load_session(self):
        self.loaded = True
        session = self._session_base.get('_auth', {})
        if session:
            self._session = session

おそらく最善の解決策ではありませんが、機能します。

于 2011-08-22T08:25:51.130 に答える