Personalizar datos para usuarios autenticados

ID de región

El REGION_ID es un código abreviado que Google asigna en función de la región que selecciones al crear tu aplicación. El código no corresponde a un país o provincia, aunque algunos IDs de región pueden parecerse a los códigos de país y provincia que se usan habitualmente. En las aplicaciones creadas después de febrero del 2020, REGION_ID.r se incluye en las URLs de App Engine. En las aplicaciones creadas antes de esa fecha, el ID de región es opcional en la URL.

Más información sobre los IDs de región

Usa la información de los usuarios autenticados para almacenar y recuperar datos específicos de cada usuario, así como para personalizar la experiencia de cada usuario con tu servicio web.

En un paso anterior, actualizó el servicio web para que mostrara las diez últimas solicitudes de todos los usuarios. En este paso, utilizarás la información del usuario autenticado para actualizar tu servicio web de forma que la página solo muestre una lista de las diez últimas solicitudes realizadas por el usuario autenticado.

Antes de empezar

Si has completado todos los pasos anteriores de esta guía, puedes saltarte esta sección. De lo contrario, realice una de las siguientes acciones:

Almacenar y recuperar datos específicos de los usuarios

Puedes indicar que los datos están conectados a un usuario concreto mediante los ancestros de Firestore en el modo de Datastore (Datastore), que te permiten organizar los datos de Datastore de forma jerárquica.

Para ello, realiza los pasos que se indican a continuación:

  1. Actualiza los métodos store_time y fetch_time para usar ancestros de Datastore al almacenar y recuperar entidades 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
    
    

    Cada entidad visit tiene ahora un ancestro al que está conectada. Estos ancestros son entidades de Datastore que representan a usuarios autenticados individuales. La clave de cada ancestro incluye el User tipo y un ID personalizado, que es la dirección de correo del usuario autenticado. Utiliza la clave de ancestro para consultar en la base de datos solo las horas asociadas a un usuario específico.

  2. Actualiza la llamada al método store_times en tu método root y muévelo al interior de la condición id_token para que solo se ejecute si el servidor ha autenticado a un usuario:

    @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
        )
    
    

Configurar índices

Datastore realiza consultas basadas en índices. En el caso de las entidades simples, Datastore genera automáticamente estos índices. Sin embargo, no puede generar automáticamente índices para entidades más complejas, incluidas las que tienen antecesores. Por este motivo, debe crear manualmente un índice para las entidades visit para que Datastore pueda realizar consultas que incluyan entidades visit.

Para crear un índice de entidades visit, sigue estos pasos:

  1. Crea un archivo index.yaml en el directorio raíz de tu proyecto (por ejemplo, building-an-app) y añade el siguiente índice:

    # 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. Despliega tus índices index.yaml en Datastore ejecutando el siguiente comando y siguiendo las indicaciones:

    gcloud datastore indexes create index.yaml
    

Datastore puede tardar un tiempo en crear los índices. Si creas índices antes de desplegar tu servicio web en App Engine, podrás hacer pruebas locales con esos índices y evitarás excepciones que puedan producirse en consultas que requieran un índice que aún esté en proceso de creación.

Ver tus índices

Para obtener más información sobre cómo crear índices de Datastore, consulta Configurar índices de Datastore.

Probar un servicio web

Prueba tu servicio web ejecutándolo de forma local en un entorno virtual:

  1. Ejecuta el siguiente comando en el directorio principal de tu proyecto para ejecutar el servicio web. Si no has configurado un entorno virtual para las pruebas locales, consulta el artículo sobre cómo probar tu servicio web.

    python main.py
    
  2. Introduce la siguiente dirección en tu navegador web para ver tu servicio web:

    http://localhost:8080
    

Desplegar un servicio web

Ahora que Datastore funciona de forma local, puedes volver a desplegar tu servicio web en App Engine.

Ejecuta el siguiente comando desde el directorio raíz de tu proyecto, donde se encuentra el archivo app.yaml:

gcloud app deploy

Todo el tráfico se dirige automáticamente a la nueva versión que has implementado.

Para obtener más información sobre cómo gestionar versiones, consulta el artículo Gestionar servicios y versiones.

Ver tu servicio

Para iniciar rápidamente tu navegador y acceder a tu servicio web en https://PROJECT_ID.REGION_ID.r.appspot.com, ejecuta el siguiente comando:

gcloud app browse

Pasos siguientes

¡Enhorabuena! Has creado correctamente un servicio web que usa el almacenamiento de datos de Datastore y la autenticación de Firebase para proporcionar a los usuarios autenticados una página web personalizada.

Ahora puedes hacer limpieza cerrando, desactivando o inhabilitando la facturación de tu proyecto.