ログインと 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))
しかし、上記の手法は機能していません。それで、私の診断には欠陥があります。
この問題を解決するための助けを求めています。同じことについてさらに情報が必要な場合はお知らせください。