認証済みユーザーのデータをパーソナライズする

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。2020 年 2 月以降に作成されたアプリの場合、REGION_ID.r は App Engine の URL に含まれています。この日付より前に作成されたアプリの場合、URL のリージョン ID は省略可能です。

詳しくは、リージョン ID をご覧ください。

認証済みユーザー情報を使用して、ユーザー固有のデータを保存および取得し、カスタマイズされたウェブサービスを提供します。

前のステップでは、すべてのユーザーからの直近 10 回のリクエストが表示されるように、ウェブサービスを更新しました。このステップでは、認証済みのユーザー情報を使用してウェブサービスを更新し、現在認証されているユーザーによる直近 10 回のリクエストだけがページに一覧表示されるようにします。

始める前に

このガイドでこれまでのステップをすべて完了している場合は、このセクションをスキップできます。それ以外の場合は、次のいずれかを実行してください。

ユーザー固有のデータの保存と取得

Datastore モードの Firestore(Datastore)の祖先を使用して、データと特定のユーザーの関連付けを示すことができます。それにより、Datastore のデータを階層で整理することが可能になります。

その方法は次のとおりです。

  1. store_time メソッドと fetch_time メソッドを更新し、Datastore の祖先を使用して visit エンティティを保存、取得できるようにします。

    datastore_client = datastore.Client()
    
    def store_time(email, dt):
        entity = datastore.Entity(key=datastore_client.key("User", email, "visit"))
        entity.update({"timestamp": dt})
    
        datastore_client.put(entity)
    
    
    def fetch_times(email, limit):
        ancestor = datastore_client.key("User", email)
        query = datastore_client.query(kind="visit", ancestor=ancestor)
        query.order = ["-timestamp"]
    
        times = query.fetch(limit=limit)
    
        return times
    
    

    visit エンティティに祖先が関連付けられました。これらの祖先は、個々の認証済みユーザーを表す Datastore のエンティティです。各祖先のキーには、User kind と、認証済みユーザーのメールアドレスであるカスタム ID が含まれています。祖先キーを使用して、特定のユーザーに関連付けられている時間に対してのみデータベースへのクエリを行います。

  2. root メソッド内の store_times メソッド呼び出しを更新して、id_token 条件内に移動し、サーバーがユーザーを認証した場合のみ実行されるようにします。

    @app.route("/")
    def root():
        # Verify Firebase auth.
        id_token = request.cookies.get("token")
        error_message = None
        claims = None
        times = None
    
        if id_token:
            try:
                # Verify the token against the Firebase Auth API. This example
                # verifies the token on each page load. For improved performance,
                # some applications may wish to cache results in an encrypted
                # session store (see for instance
                # http://flask.pocoo.org/docs/1.0/quickstart/#sessions).
                claims = google.oauth2.id_token.verify_firebase_token(
                    id_token, firebase_request_adapter
                )
    
                store_time(claims["email"], datetime.datetime.now(tz=datetime.timezone.utc))
                times = fetch_times(claims["email"], 10)
    
            except ValueError as exc:
                # This will be raised if the token is expired or any other
                # verification checks fail.
                error_message = str(exc)
    
        return render_template(
            "index.html", user_data=claims, error_message=error_message, times=times
        )
    
    

インデックスを構成する

Datastore はインデックスに基づいてクエリを作成します。単純なエンティティでは、Datastore がそれらのインデックスを自動的に生成します。ただし、祖先があるエンティティなど、より複雑なエンティティについては、インデックスを自動的に生成することはできません。そのため、visit エンティティについてはインデックスを手動で作成し、Datastore が visit エンティティを含むクエリを実行できるようにする必要があります。

visit エンティティのインデックスを作成するには、次の手順を実行します。

  1. プロジェクトのルート ディレクトリに index.yaml ファイル(building-an-app など)を作成し、次のインデックスを追加します。

    # Copyright 2021 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    indexes:
    
    - kind: visit
      ancestor: yes
      properties:
      - name: timestamp
        direction: desc
    
  2. 次のコマンドを実行し、以下のプロンプトに従って index.yaml インデックスを Datastore にデプロイします。

    gcloud datastore indexes create index.yaml
    

Datastore でインデックスを作成するには、少し時間がかかる場合があります。App Engine にウェブサービスをデプロイする前にインデックスを作成することで、そのインデックスを使用してローカルでテストを行い、構築中のインデックスを必要とするクエリで発生する例外を防止できます。

インデックスの表示

Datastore インデックスの作成について詳しくは、データストア インデックスの構成をご覧ください。

ウェブサービスのテスト

ウェブサービスを仮想環境でローカルに実行してテストします。

  1. プロジェクトのメイン ディレクトリで次のコマンドを実行して、ウェブサービスを実行します。ローカルテスト用に仮想環境を設定していない場合は、ウェブサービスのテストをご覧ください。

    python main.py
    
  2. ウェブサービスを表示するには、ウェブブラウザに次のアドレスを入力します。

    http://localhost:8080
    

ウェブサービスをデプロイする

Datastore をローカルで使用できるようになったので、次にウェブサービスを App Engine にデプロイする方法を学習します。

プロジェクトのルート ディレクトリから次のコマンドを実行します。ここで、app.yaml ファイルは次の場所にあります。

gcloud app deploy

すべてのトラフィックは、デプロイした新しいバージョンに自動的にルーティングされます。

バージョン管理の詳細については、サービスとバージョンの管理をご覧ください。

サービスを表示する

ブラウザを速やかに起動して https://PROJECT_ID.REGION_ID.r.appspot.com でウェブサービスにアクセスするには、次のコマンドを実行します。

gcloud app browse

次のステップ

これで完了です。Datastore のデータ ストレージと Firebase authentication を使用して認証済みユーザーにパーソナルなウェブページを提供する、ウェブサービスを構築しました。

プロジェクトのシャットダウン、停止、課金の無効化により、クリーンアップを行えます。