今日、私はこれに遭遇しましたが、それはさらに悪いことでした: ユーザー A として (Google サイトのページから) ログアウトし、ユーザー B としてログインしましたが、私の GAE アプリはまだユーザー A としてログインしていると認識していました。
これは、2 つの Cookie が関係しているためです。1 つはどの Google ユーザーが Google にログインしているかを追跡するためのもので、もう 1 つはどの GAE アプリケーション ユーザーが私の GAE アプリケーションにログインしているかを追跡するためのものです。GAE は、Google だけでなく、任意のフェデレーション認証サービスを使用できることを思い出してください。私のアプリケーションは google.com Cookie にアクセスできないため、ユーザー A がまだログインしているかどうか (または現在ログインしているユーザー) を直接確認することはできません。
残念ながら、単純な「フェデレーション ログアウト」メカニズムはまだ見つかっていませんが、Google Identity Toolkitを使用して、予想されるユーザーがログインしていないことを検出できる可能性があります。
この問題について話し合っている他の人を見つけました:
アップデート
私は自分のアプリケーションで機能するソリューションを思いつきました。そこでは、ユーザー (学生) を自分の教室のホームページにリダイレクトするページがあります。1 人の生徒がこれにアクセスする頻度は低い (1 日に数回) ため、どの生徒がログインしているかを知る必要があるため、次の方法を採用しました。
- ユーザーはページ A に移動し、ACSID および SACSID Cookie が消去され、ユーザーがログインするために Google にリダイレクトされます。
- ユーザーはおそらくすでにログインしているため、Google は (いくつかのリダイレクトを使用して) ACSID および SACSID Cookie を現在ログインしているユーザーに更新し、ページ B のアプリケーションにリダイレクトします。
- ページ B は最終的に、ログインしているユーザーに代わってアクションを実行し、正しいユーザーがログインしていることを「確信」します (ページが確信している範囲で)。;-)
アプローチのコード スケッチを次に示します。
# My BaseHandler has a clear_cookie
class LoginAndRedirectHandler(base_handler.BaseHandler):
def get(self):
self.clear_cookie('ACSID')
self.clear_cookie('SACSID')
self.clear_cookie('dev_appserver_login')
if 'continue' in self.request.params and \
self.request.params['continue'].startswith('/'):
url = self.request.params['continue']
else:
# Whatever your page is that needs an up to date logged in user
url = users.create_login_url('/PageB')
if isinstance(url, unicode):
url = url.encode('utf8')
logging.info('Redirecting to ' + url)
self.redirect(url)
return
上記であまり言及しなかった理由は、このプロセスには時間がかかり、少なくとも 4 ~ 5 回のリダイレクトが必要になるためです。