2

Google App Engine をバックエンドとして使用する認証システムがあります。基盤となる言語とフレームワークは、Java、JDO、Google 認証、Google App Engine で構成されています。

ユーザーエンティティがあります。ユーザー エンティティは、Google App Engine の認証応答から保存されたユーザー メタデータです (例: 名、姓、電子メール アドレス)。

ユーザーが登録またはログイン (どちらもサインイン イベント) を試みると、データストアをスキャンして、同じ電子メール アドレスを持つユーザーが既に存在するかどうかを確認します。ユーザーがまだ存在しない場合は、新しいユーザーを作成します。ユーザーが存在する場合は、ユーザー情報を更新して取得し、アプリケーション データを取得します。

ログイン ページはアプリケーション ページから完全に分離されているため、個別の複数のトランザクションを実行する必要があります。

ユーザーが短期間に 2 回登録しようとすると、重複したユーザーが作成される場合があります。最後に登録されたユーザーをいつでも取得できますが、クエリを一意の JDO クエリにする必要があります。一意の JDO クエリを使用すると、JDO クエリ (トランザクション内で実行) が (ユーザーの電子メール アドレスに対して) 2 つの同一の値が見つかったために失敗することがあります。

制約を適用するために、次の方法を検討しました。

  1. 新しく登録されたユーザーの情報をキャッシュに保存します。キャッシュが重複を防ぐための適切なソリューションであることを示唆する情報は見つかりませんでした。キャッシュはマシン間ですぐに利用できますか? 存在する場合でも、キャッシュはさまざまな理由でエンティティを排出する可能性があります。
  2. ユーザーの電子メールをセッションに保存します。これはコードを肥大化させ、制約を強制する奇妙な方法のように思われました。

認証ワークフロー中の値の重複を防ぎ、トランザクションを分離するための Google App Engine のベスト プラクティス アプローチはありますか?

4

1 に答える 1