2

ログインと webapps2 フレームワークにSimple Authを使用する Google Appengine (Python 2.7) で実行されているアプリケーションがあります。現在、Facebook ログインのみをサポートしています。

問題: Facebook のログイン - セッションの作成が正しく機能しないことがあります。これは常に発生するわけではなく、サイトのトラフィック全体の 10% にしか影響しません。Facebook 認証から当サイトへのコールバックは適切に行われ、Facebook 認証トークンも取得できます。ただし、セッションの作成だけでは失敗します。

制御フロー: 1) ユーザーがページの [Facebook でログイン] ボタンをクリックする 2) ユーザーが許可のために Facebook にリダイレクトされる (初めてのログインの場合) 3) ユーザーが Facebook で適切な承認を与えると、サイトにリダイレクトされます 4 ) 当サイトでユーザー認証トークンを取得し、このトークンを使用して Facebook グラフ API からユーザーの詳細を取得します 5) セッションが作成され、応答オブジェクトに Cookie ヘッダーが設定されます (現在、問題が発生している場所) 6) ユーザーは次の場所にリダイレクトされますダッシュボード (ダッシュボードはログインしたユーザーのみに表示される画面です。そのため、セッション/Cookie が適切に作成されていない場合、ユーザーはログイン ページにリダイレクトされます)。

解決策は既に試しました: 私の最初の推測では、セッションの作成は、次のコード行の実行よりも時間がかかっているということでした。これは、セッションの作成が非同期プロセスである場合に発生する可能性があります。そのため、セッション作成行と次の行の間にわずかな遅延を含めました。アイデアは、コミットされていない変更がコミットされるのに十分な時間を与えることでした。さらに、スリープ時間の終了時にセッションが実際に作成されていない場合は、セッション オブジェクトを再作成しようとします。

ok, user = self.auth.store.user_model.create_user(auth_id, **_attrs)
logging.info("creating user : "+str(ok)+" | user" +str(user))
if ok:
    self.auth.set_session(self.auth.store.user_to_dict(user))
    logging.info("User: "+str(self.auth.get_user_by_session()))
    if( self.auth.get_user_by_session() is None ):
        logging.info("Existing user logging in.. But the set session didn't work So wait for sometime")
        time.sleep(0.5)
        if( self.auth.get_user_by_session() is None ):
            logging.info("Existing user logging in.. But the set session didn't work So try again")
            self.auth.set_session(self.auth.store.user_to_dict(user))

しかし、上記の手法は機能していません。それで、私の診断には欠陥があります。

この問題を解決するための助けを求めています。同じことについてさらに情報が必要な場合はお知らせください。

4

1 に答える 1

0

一般に、待機は同期の言い訳にはなりません。

どちらの場合でも、認証ライブラリを掘り下げて調査する必要があります。auth.set_session を非同期にしたくありません。同期にします。それは人生を楽にするはずです。

get_user_by_session() がどのように機能するかを調べてください。あなたが説明する問題は、結果整合性の動作によく似ています。これは、get_user_by_session() がデータストア クエリ操作を発行した場合に発生する可能性があり、最終的に一貫性のある結果が返される可能性があります。get_user_by_session() オペレーションでは、強い一貫性のある結果が必要なため、ライブラリはデータストアの get オペレーションを使用する必要があります。実際、ユーザーとセッションを作成したばかりなので、ライブラリはその情報をキャッシュしているはずであり、データストアにアクセスする必要はまったくありません。

ライブラリは Python であるため、ライブラリ コードをステップ実行して、何が起こっているのかを理解できるはずです。

于 2013-06-25T16:24:39.773 に答える