Instrucciones y requisitos de configuración del lab
Protege tu cuenta y tu progreso. Usa siempre una ventana de navegador privada y las credenciales del lab para ejecutarlo.

Protección de APIs con Apigee X

Lab 35 minutos universal_currency_alt 5 créditos show_chart Intermedio
info Es posible que este lab incorpore herramientas de IA para facilitar tu aprendizaje.
Este contenido aún no está optimizado para dispositivos móviles.
Para obtener la mejor experiencia, visítanos en una computadora de escritorio con un vínculo que te enviaremos por correo electrónico.

GSP844

Logotipo de los labs de autoaprendizaje de Google Cloud

Descripción general

Apigee es una plataforma para desarrollar y administrar las APIs. Apigee puede ayudarte a proteger el acceso a tus APIs y a limitar la frecuencia de acceso a ellas. Apigee también proporciona funciones que se usan para proteger el acceso interno a los datos de la API.

En este lab, crearás una API que requiere tokens de OAuth para el acceso. Aplicarás la política de SpikeArrest para limitar la tasa de llamadas a la API por aplicación y usarás variables privadas y enmascaramiento de datos para ocultar datos sensibles de los usuarios que depuran el tráfico de la API.

Objetivos

En este lab, aprenderás a realizar las siguientes tareas:

  • Proteger el acceso a las APIs solicitando un token de OAuth
  • Limitar la tasa general de tráfico y la tasa por aplicación con la política de SpikeArrest
  • Usar variables privadas y enmascaramiento de datos para ocultar datos sensibles mientras se depuran las llamadas a la API
  • Restringir las llamadas al backend a los recursos especificados
  • Volver a escribir los mensajes de error del backend para brindar protección contra la filtración de datos

Configuración y requisitos

Antes de hacer clic en el botón Comenzar lab

Lee estas instrucciones. Los labs cuentan con un temporizador que no se puede pausar. El temporizador, que comienza a funcionar cuando haces clic en Comenzar lab, indica por cuánto tiempo tendrás a tu disposición los recursos de Google Cloud.

Este lab práctico te permitirá realizar las actividades correspondientes en un entorno de nube real, no en uno de simulación o demostración. Para ello, se te proporcionan credenciales temporales nuevas que utilizarás para acceder a Google Cloud durante todo el lab.

Para completar este lab, necesitarás lo siguiente:

  • Acceso a un navegador de Internet estándar. Se recomienda el navegador Chrome.
Nota: Usa una ventana del navegador privada o de incógnito (opción recomendada) para ejecutar el lab. Así evitarás conflictos entre tu cuenta personal y la cuenta de estudiante, lo que podría generar cargos adicionales en tu cuenta personal.
  • Tiempo para completar el lab (recuerda que, una vez que comienzas un lab, no puedes pausarlo).
Nota: Usa solo la cuenta de estudiante para este lab. Si usas otra cuenta de Google Cloud, es posible que se apliquen cargos a esa cuenta. Nota: Se recomienda que uses una nueva ventana de incógnito para completar este lab.

Cómo iniciar tu lab y acceder a la consola de Google Cloud

  1. Haz clic en el botón Comenzar lab. Si debes pagar por el lab, se abrirá un diálogo para que selecciones la forma de pago. A la izquierda, se encuentra el panel Detalles del lab, que tiene estos elementos:

    • El botón para abrir la consola de Google Cloud
    • El tiempo restante
    • Las credenciales temporales que debes usar para el lab
    • Otra información para completar el lab, si es necesaria
  2. Haz clic en Abrir la consola de Google Cloud (o haz clic con el botón derecho y selecciona Abrir el vínculo en una ventana de incógnito si ejecutas el navegador Chrome).

    El lab inicia recursos y abre otra pestaña en la que se muestra la página de acceso.

    Sugerencia: Ordena las pestañas en ventanas separadas, una junto a la otra.

    Nota: Si ves el diálogo Elegir una cuenta, haz clic en Usar otra cuenta.
  3. De ser necesario, copia el nombre de usuario a continuación y pégalo en el diálogo Acceder.

    {{{user_0.username | "Username"}}}

    También puedes encontrar el nombre de usuario en el panel Detalles del lab.

  4. Haz clic en Siguiente.

  5. Copia la contraseña que aparece a continuación y pégala en el diálogo Te damos la bienvenida.

    {{{user_0.password | "Password"}}}

    También puedes encontrar la contraseña en el panel Detalles del lab.

  6. Haz clic en Siguiente.

    Importante: Debes usar las credenciales que te proporciona el lab. No uses las credenciales de tu cuenta de Google Cloud. Nota: Usar tu propia cuenta de Google Cloud para este lab podría generar cargos adicionales.
  7. Haz clic para avanzar por las páginas siguientes:

    • Acepta los Términos y Condiciones.
    • No agregues opciones de recuperación o autenticación de dos factores (esta es una cuenta temporal).
    • No te registres para obtener pruebas gratuitas.

Después de un momento, se abrirá la consola de Google Cloud en esta pestaña.

Nota: Para acceder a los productos y servicios de Google Cloud, haz clic en el menú de navegación o escribe el nombre del servicio o producto en el campo Buscar. Ícono del menú de navegación y campo de búsqueda

Activa Cloud Shell

Cloud Shell es una máquina virtual que cuenta con herramientas para desarrolladores. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud. Cloud Shell proporciona acceso de línea de comandos a tus recursos de Google Cloud.

  1. Haz clic en Activar Cloud Shell Ícono de Activar Cloud Shell en la parte superior de la consola de Google Cloud.

  2. Haz clic para avanzar por las siguientes ventanas:

    • Continúa en la ventana de información de Cloud Shell.
    • Autoriza a Cloud Shell para que use tus credenciales para realizar llamadas a la API de Google Cloud.

Cuando te conectes, habrás completado la autenticación, y el proyecto estará configurado con tu Project_ID, . El resultado contiene una línea que declara el Project_ID para esta sesión:

Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}

gcloud es la herramienta de línea de comandos de Google Cloud. Viene preinstalada en Cloud Shell y es compatible con la función de autocompletado con tabulador.

  1. Puedes solicitar el nombre de la cuenta activa con este comando (opcional):
gcloud auth list
  1. Haz clic en Autorizar.

Resultado:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. Puedes solicitar el ID del proyecto con este comando (opcional):
gcloud config list project

Resultado:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} Nota: Para obtener toda la documentación de gcloud, en Google Cloud, consulta la guía con la descripción general de gcloud CLI.

Abre la consola de Apigee

Para abrir la consola de Apigee, haz lo siguiente:

  • En el campo Buscar de la consola de Google Cloud, ingresa Apigee y, luego, haz clic en Administración de APIs de Apigee en los resultados de la búsqueda.

Se abrirá la consola de Apigee y, en la página de destino, se mostrarán vínculos rápidos a ubicaciones de uso frecuente.

  • En el menú de navegación (Menú de navegación), junto a Apigee, haz clic en Favorito (Ícono de favorito).

Apigee ahora se agregó como favorito al menú de navegación.

Tarea 1: Actúa como proxy del servicio de backend con un proxy de API de Apigee

En esta tarea, crearás un proxy de API de Apigee que actuará como una fachada para un servicio de backend. El proxy de API usará una cuenta de servicio para permitirle presentar tokens de identidad de OpenID Connect al servicio de Cloud Run.

Ya se creó un servicio de backend llamado simplebank-rest y se implementó en Cloud Run. También se creó una cuenta de servicio para ti.

Crea el proxy de Apigee

  1. En Cloud Shell, para recuperar la URL del servicio de backend, usa el siguiente comando:

    gcloud run services describe simplebank-rest --platform managed --region {{{project_0.default_region |REGION}}} --format 'value(status.url)'

    Guarda esta URL, ya que se usará cuando crees el proxy de API.

  2. Navega a la IU de Apigee en la consola de Cloud.

  3. En el menú de navegación de la izquierda, selecciona Desarrollo de proxies > Proxies de API.

  4. Para crear un proxy nuevo con el asistente de proxy, haz clic en +Crear.

    Crearás un proxy inverso para tu servicio de backend. Este proxy de API usará una especificación de OpenAPI para crear el esqueleto de la API.

  5. En el cuadro Plantilla de proxy, en Plantilla de especificación de OpenAPI, selecciona Proxy inverso (más común).

  6. Para obtener el archivo de OpenAPI, abre la URL en un navegador y se descargará el archivo YAML de especificación de OpenAPI en tu computadora:

    https://storage.googleapis.com/spls/gsp844/simplebank-backend.yaml
  7. Haz clic en Explorar, selecciona el archivo OpenAPI de la computadora y haz clic en Siguiente.

  8. Especifica lo siguiente para los detalles del proxy:

    Propiedad Valor
    Nombre del proxy bank-v1
    Ruta de acceso base /bank/v1
    Descripción API de solo lectura de SimpleBank
    (API existente) de destino URL del backend
    Nota: Confirma que estás usando "/bank/v1" para la ruta de acceso base y no "/bank-v1".

    El destino debe ser la URL del backend que recuperaste anteriormente en la tarea. El destino debería ser similar a lo siguiente:

    https://simplebank-rest-nu7rb74j5a-uw.a.run.app
  9. Haz clic en Siguiente.

  10. Deja el resto de los parámetros con la configuración predeterminada y haz clic en Crear.

  11. Haz clic en la pestaña Desarrollar.

    Nota: Se agregaron flujos al extremo del proxy, y cada uno especifica un verbo y una condición de ruta de una de las operaciones de la especificación de OpenAPI.

Modifica el destino para enviar un token de identidad de OpenID Connect

El servicio de backend se implementa para requerir acceso autenticado, por lo que no puedes llamar al servicio sin un token de identidad de OpenID Connect válido.

HTTPTargetConnection especifica el destino de backend para el servicio.

  1. En el menú Navegador del proxy, en la sección Extremos de destino, haz clic en PreFlow.

  2. Busca el siguiente código (tu URL será diferente):

    <HTTPTargetConnection> <URL>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</URL> </HTTPTargetConnection> Nota: Si no ves la sección HTTPTargetConnection, asegúrate de haber hecho clic en PreFlow en la sección Extremos de destino, no en la sección Extremos de proxy.
  3. Debajo de la URL, agrega una sección Autenticación que se vea de la siguiente manera:

    <Authentication> <GoogleIDToken> <Audience>AUDIENCE</Audience> </GoogleIDToken> </Authentication>
  4. Reemplaza AUDIENCE por el valor de URL que ya se encuentra en la sección HTTPTargetConnection. Ahora, tu código debería ser similar al siguiente, excepto que tendrá tu URL específica en los elementos URL y Audience:

    <TargetEndpoint name="default"> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <Flows/> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> <HTTPTargetConnection> <URL>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</URL> <Authentication> <GoogleIDToken> <Audience>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</Audience> </GoogleIDToken> </Authentication> </HTTPTargetConnection> </TargetEndpoint>
  5. Haz clic en Guardar.

Haz clic en Revisar mi progreso para verificar el objetivo. Crear el proxy de API

Tarea 2: Agrega OAuth al proxy de API

En esta tarea, agregarás una política de OAuthV2 al proxy de API. Una política de OAuthV2 que usa la operación VerifyJWTAccessToken aplica de manera forzosa la verificación de los tokens de acceso en el entorno de ejecución, lo que permite que solo las aplicaciones con un token de acceso de OAuth válido accedan a la API.

La política de OAuthV2 puede crear y verificar tanto tokens opacos como tokens web JSON (JWT). Este proxy de API usará JWT para los tokens de acceso.

Se usará un conjunto de propiedades para almacenar el secreto de firma que se utiliza en la creación y verificación del JWT.

Crea el secreto de firma en el conjunto de propiedades

El JWT se firmará con un código de autenticación de mensajes basado en hash (HMAC). Este tipo de firma criptográfica requiere un secreto.

  1. En el menú Navegador del proxy, junto a Recursos, haz clic en +.

  2. En el menú desplegable Tipo de recurso, selecciona Property Set.

  3. Especifica oauth.properties para el Nombre del recurso y, luego, haz clic en Agregar.

  4. En el panel de código oauth.properties, agrega la siguiente propiedad:

    secret=thisisnotagoodsecret,useabettersecretinproduction

    Se puede acceder a este valor en el código con la variable de flujo propertyset.oauth.secret.

    Nota: Los valores de los conjuntos de propiedades se almacenan en texto simple. En un entorno de producción, es probable que almacenes el secreto de HMAC en una ubicación encriptada y, sin duda, querrás usar un secreto más seguro (aleatorio).

Agrega una política AssignMessage para recuperar el valor del conjunto de propiedades

El secreto de firma se debe proporcionar a la política de OAuth en una variable privada, pero la variable propertyset.oauth.secret no es privada. Esta política AssignMessage creará una variable privada a partir de la variable del conjunto de propiedades.

  1. En el menú Navegador del proxy, en la sección Extremos de proxy, en predeterminado, haz clic en PreFlow.

    El PreFlow de solicitud en el extremo de proxy predeterminado es el primer flujo que se ejecuta cuando una solicitud ingresa al proxy de API.

    La política OAuthV2 requiere el secreto y se ejecutará muy temprano en el proxy de API.

  2. En el panel Flujo, haz clic en el botón + junto a PreFlow en el flujo de solicitud.

  3. Selecciona Crear una política nueva y, en el menú desplegable Seleccionar política, elige Asignar mensaje en la sección Mediación. Luego, establece AM-GetSecret como Nombre visible y Nombre.

  4. Haz clic en Agregar. Haz clic en AM-GetSecret en Políticas en el menú Navegador.

    La configuración de la política AssignMessage se muestra en el panel Código.

  5. Cambia la configuración de la política a lo siguiente:

    <AssignMessage name="AM-GetSecret"> <AssignVariable> <Name>private.secretkey</Name> <Ref>propertyset.oauth.secret</Ref> </AssignVariable> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </AssignMessage>

    El parámetro de configuración AssignVariable copia la variable propertyset.oauth.secret en la variable private.secretkey.

    El parámetro de configuración IgnoreUnresolvedVariables hace que la política AssignMessage genere una falla si no se puede resolver propertyset.oauth.secret.

Agrega la política de OAuthV2 para verificar un token

  1. En el menú Navegador del proxy, en la sección Extremos de proxy, en predeterminado, haz clic en PreFlow.

    La política de OAuthV2 debe ejecutarse después de la política AssignMessage.

  2. En el panel Flujo, haz clic en el botón + junto a PreFlow en el flujo de solicitud.

  3. Selecciona Crear una política nueva y, en el menú desplegable Seleccionar política, selecciona OAuth v2.0 en la sección Seguridad. Luego, establece OA-VerifyToken como Nombre visible y Nombre.

  4. Haz clic en Agregar y, luego, en OA-VerifyToken en Políticas en el menú Navegador.

    La configuración de la política de OAuthV2 se muestra en el panel Código.

  5. Cambia la configuración de la política de OAuthV2 a lo siguiente:

    <OAuthV2 name="OA-VerifyToken"> <Operation>VerifyJWTAccessToken</Operation> <Algorithm>HS256</Algorithm> <SecretKey> <Value ref="private.secretkey"/> </SecretKey> </OAuthV2>

    La configuración especifica que el token de acceso JWT usará el algoritmo HS256 (HMAC-SHA256) con la variable privada creada en la política AssignMessage como clave secreta.

  6. Haz clic en Guardar.

Haz clic en Revisar mi progreso para verificar el objetivo. Agregar políticas para verificar tokens

Tarea 3: Agrega políticas para generar tokens

También se agregará un extremo de proxy independiente al proxy de API para permitir la creación de los tokens JWT.

Agrega un extremo de proxy nuevo para las operaciones de tokens

En un entorno de producción, se suele crear un proxy independiente para generar tokens. En este lab, crearás el flujo de generación de tokens en un extremo de proxy independiente dentro del mismo proxy de API.

  1. En el menú Navegador del proxy, en la fila Extremos de proxy, haz clic en el botón +.

    Nota: No hagas clic en el botón “+” que se encuentra junto a “predeterminado”.

    Esto creará un extremo de proxy nuevo que se usará cuando se cree un JWT nuevo.

  2. En Nombre, especifica token y, luego, haz clic en Agregar.

    El nuevo extremo del proxy llamado token se mostrará en el panel Código.

  3. Cambia toda la configuración del flujo de token para que pase de:

    <ProxyEndpoint name="token"> . . . </ProxyEndpoint>

    a:

    <ProxyEndpoint name="token"> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> <Flows/> <HTTPProxyConnection> <BasePath>/token</BasePath> </HTTPProxyConnection> <RouteRule name="noTarget"/> </ProxyEndpoint>
  4. Haz clic en Guardar.

    Con esta configuración actualizada, se generan 2 cambios específicos:

    • BasePath se establece en /token. Esta es la ruta de acceso base que se usará cuando se cree un token.
    • RouteRule ya no hace referencia a un extremo de destino. El proxy de API crea un token sin llamar al servicio de backend.

Crea un flujo para generar un token

  1. En el flujo del proxy, en la sección Extremos de proxy: token, justo al lado de /token, haz clic en +.

  2. Para el nuevo flujo condicional, especifica los siguientes valores:

    Propiedad Valor
    Nombre del flujo generateToken
    Tipo de condición selecciona Personalizada
  3. En Condición, especifica este valor:

    (proxy.pathsuffix MatchesPath "/") and (request.verb = "POST") and (request.formparam.grant_type = "client_credentials")

    Solo se permitirán las solicitudes de tokens de credenciales de cliente válidas.

  4. Haz clic en Agregar.

Adjunta la política AssignMessage para recuperar el valor del conjunto de propiedades

La política de OAuthV2 que generará tokens también necesitará acceso a la variable private.secretkey.

  1. En el menú Navegador del proxy, en la sección Extremos de proxy, en token, haz clic en generateToken.

  2. En el panel Flujo, haz clic en el botón + a la derecha, junto a generateToken en el flujo de solicitud.

  3. En Seleccionar política, elige la opción Seleccionar política existente y, luego, haz clic en AM-GetSecret.

  4. Haz clic en Agregar.

    La misma política AssignMessage se adjunta al PreFlow del extremo del proxy de token.

Agrega una política de OAuthV2 para generar un token

  1. En el menú Navegador del proxy, en la sección Extremos de proxy, en token, haz clic en generateToken.

  2. En el panel Flujo, haz clic en el botón + a la derecha, junto a generateToken en el flujo de solicitud.

  3. En Seleccionar política, selecciona Crear una política nueva y OAuth v2.0 en la sección Seguridad. Luego, establece OA-GenerateToken como Nombre visible y Nombre.

  4. Haz clic en Agregar y, luego, en OA-GenerateToken en Políticas.

    La configuración de la política de OAuthV2 se muestra en el panel Código.

  5. Cambia la configuración de la política de OAuthV2 a lo siguiente:

    <OAuthV2 name="OA-GenerateToken"> <Operation>GenerateJWTAccessToken</Operation> <Algorithm>HS256</Algorithm> <SecretKey> <Value ref="private.secretkey"/> </SecretKey> <SupportedGrantTypes> <!-- pass client_id and client_secret via basic auth header --> <GrantType>client_credentials</GrantType> </SupportedGrantTypes> <!-- 1800000 ms = 1800 s = 30 min --> <ExpiresIn>1800000</ExpiresIn> <GenerateResponse enabled="true"/> <RFCCompliantRequestResponse>true</RFCCompliantRequestResponse> </OAuthV2>

    Esta configuración permitirá la creación de un token de OAuth de JWT que vence dentro de 30 minutos.

Genera una falla para una solicitud de token no válida

  1. En el flujo del proxy, en la sección Extremos de proxy: token, justo al lado de /token, haz clic en +.

  2. Para el nuevo flujo condicional, especifica los siguientes valores:

    Propiedad Valor
    Nombre del flujo invalidRequest
    Tipo de condición selecciona Personalizada
    Condición DELETETHIS

    La condición se borrará una vez que se agregue el flujo, ya que cualquier solicitud de generateToken no válida debe pasar por este flujo.

  3. Haz clic en Agregar.

  4. En el flujo invalidRequest, quita la siguiente línea:

    <Condition>DELETETHIS</Condition>
  5. En el menú Navegador del proxy, en la sección Extremos de proxy, en token, haz clic en invalidRequest.

  6. En el panel Flujo, haz clic en el botón + junto a invalidRequest para el flujo de solicitud.

  7. Selecciona Crear una política nueva y, luego, Generar una falla en la sección Mediación. Luego, establece RF-InvalidTokenRequest como Nombre visible y Nombre.

  8. Haz clic en Agregar y, luego, en RF-InvalidTokenRequest en Políticas.

    La configuración de la política RaiseFault se muestra en el panel Código.

  9. Cambia la configuración de la política RaiseFault a la siguiente:

    <RaiseFault name="RF-InvalidTokenRequest"> <FaultResponse> <Set> <StatusCode>400</StatusCode> <ReasonPhrase>Bad Request</ReasonPhrase> <Payload contentType="application/json">{ "error":"Bad request: use POST /token" }</Payload> </Set> </FaultResponse> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </RaiseFault>

    Si la solicitud no es válida, se creará una respuesta Error 400: Solicitud incorrecta.

  10. Haz clic en Guardar.

Haz clic en Revisar mi progreso para verificar el objetivo. Agregar políticas para generar tokens

Tarea 4: Implementa el proxy de OAuth

En esta tarea, implementarás el proxy de API y confirmarás que para el acceso se requiere un token de OAuth.

Confirma que la instancia del entorno de ejecución esté disponible

  1. En Cloud Shell, pega y ejecuta el siguiente conjunto de comandos:

    export INSTANCE_NAME=eval-instance; export ENV_NAME=eval; export PREV_INSTANCE_STATE=; echo "waiting for runtime instance ${INSTANCE_NAME} to be active"; while : ; do export INSTANCE_STATE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}" | jq "select(.state != null) | .state" --raw-output); [[ "${INSTANCE_STATE}" == "${PREV_INSTANCE_STATE}" ]] || (echo; echo "INSTANCE_STATE=${INSTANCE_STATE}"); export PREV_INSTANCE_STATE=${INSTANCE_STATE}; [[ "${INSTANCE_STATE}" != "ACTIVE" ]] || break; echo -n "."; sleep 5; done; echo; echo "instance created, waiting for environment ${ENV_NAME} to be attached to instance"; while : ; do export ATTACHMENT_DONE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}/attachments" | jq "select(.attachments != null) | .attachments[] | select(.environment == \"${ENV_NAME}\") | .environment" --join-output); [[ "${ATTACHMENT_DONE}" != "${ENV_NAME}" ]] || break; echo -n "."; sleep 5; done; echo "***ORG IS READY TO USE***";

    Esta serie de comandos usa la API de Apigee para determinar cuándo se creó la instancia del entorno de ejecución y se conectó el entorno de evaluación.

  2. Espera hasta que la instancia esté lista.

    Cuando se muestra el texto ***ORG IS READY TO USE***, la instancia está lista. Es posible que la organización de Apigee (org) se haya creado antes de que comenzaras el lab, por lo que tal vez no tengas que esperar a que se cree la instancia.

    Si estás esperando que la organización esté lista, puedes obtener información sobre OAuth, la política de SpikeArrest, el enmascaramiento y el ocultamiento de datos, y los tokens opacos y los JWT.

Implementa el proxy de API

  1. Navega a Apigee en la consola de Cloud.

  2. En el menú de navegación de la izquierda, selecciona Desarrollo de proxy > Proxies de API y, luego, haz clic en bank-v1.

  3. Haz clic en la pestaña Desarrollar.

  4. Haz clic en Implementar y, en Entorno, selecciona evaluación.

    En un cuadro de diálogo se te pedirá que confirmes la implementación.

  5. En Cuenta de servicio, especifica la dirección de correo electrónico de la cuenta de servicio:

    apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
  6. Haz clic en Implementar y, luego, en Confirmar.

  7. Haz clic en la pestaña Descripción general y espera a que el estado de implementación de evaluación muestre que se implementó el proxy.

Haz clic en Revisar mi progreso para verificar el objetivo. Implementar el proxy de API

Prueba el proxy de API

Se puede llamar al entorno de evaluación en la organización de Apigee con el nombre de host eval.example.com. La entrada de DNS para este nombre de host se creó dentro de tu proyecto y se resuelve en la dirección IP de la instancia de entorno de ejecución de Apigee. Esta entrada de DNS se creó en una zona privada, lo que significa que solo puede verse en la red interna.

Cloud Shell no reside en la red interna, por lo que los comandos de Cloud Shell no pueden resolver esta entrada de DNS. Una máquina virtual (VM) dentro de tu organización puede acceder al DNS de la zona privada. Se creó automáticamente una máquina virtual llamada apigeex-test-vm. Puedes usar esta máquina para llamar al proxy de API.

  1. En Cloud Shell, abre una conexión SSH a tu VM de prueba:

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite

    Si se te solicita autorización, haz clic en Autorizar.

  2. Para cada pregunta que se haga en Cloud Shell, haz clic en Intro o Retorno para especificar la entrada predeterminada.

    La identidad con la que accediste es la propietaria del proyecto, por lo que se permite la conexión SSH a esta máquina.

    Tu sesión de Cloud Shell ahora se ejecuta dentro de la VM.

  3. Llama al proxy de API bank-v1 implementado en el entorno de evaluación:

    curl -i -k -X GET "https://eval.example.com/bank/v1/customers"

    La opción -k le indica a curl que omita la verificación del certificado TLS. En este lab, el entorno de ejecución de Apigee usa un certificado autofirmado en lugar de un certificado creado por una autoridad certificadora (AC) de confianza.

    Nota: No debes usar la opción -k para omitir la verificación de certificados en casos de uso de producción.

    Esta API intenta recuperar una lista de clientes. Ahora deberías ver una respuesta 401 (solicitud no autorizada) similar a esta:

    HTTP/2 401 content-type: application/json www-authenticate: Bearer realm="null",error="invalid_token",error_description="oauth.v2.InvalidAccessToken: Invalid access token" x-request-id: 99263881-d0f7-4495-b886-0253f28a2e05 content-length: 101 date: Tue, 11 Jan 2022 18:59:01 GMT via: 1.1 google {"fault":{"faultstring":"Invalid access token","detail":{"errorcode":"oauth.v2.InvalidAccessToken"}}}

    Esta respuesta indica que el proxy de API bloqueó el acceso al servicio de backend porque no se proporcionó el token de acceso.

  4. Ingresa el comando exit para salir de la sesión de SSH y regresar a Cloud Shell.

Tarea 5: Agrega un producto de API, un desarrollador y una aplicación

En esta tarea, agregarás un producto de API que proporcionará acceso a tu API. También crearás un desarrollador y, luego, una aplicación que estará asociada con tu producto de API.

Crea un producto de API

  1. Navega a Apigee en la consola de Cloud.

  2. En el menú de navegación de la izquierda, selecciona Distribución > Productos de API.

  3. Para crear un nuevo producto de API, haz clic en +Crear.

  4. En el panel Detalles del producto, especifica lo siguiente:

    Propiedad Valor
    Nombre bank-readonly
    Nombre visible banco (acceso de lectura)
    Entorno selecciona evaluación
    Acceso selecciona Público

    Deja seleccionada la opción Aprobar automáticamente las solicitudes de acceso.

  5. En la sección Operaciones, haz clic en +Agregar una operación.

    Las operaciones se usan con el objetivo de especificar qué solicitudes en qué proxies de API se permiten para una aplicación asociada con el producto de API.

    Nota: Confirma que el botón se encuentre en la sección "Operaciones", no en la sección "Operaciones de GraphQL".
  6. Especifica lo siguiente:

    Propiedad Valor
    Proxy de API selecciona el proxy de API bank-v1
    Ruta de acceso /**
    Métodos selecciona GET

    La expresión de ruta de acceso /\*\* indica que se permitirá cualquier solicitud que coincida con la ruta de acceso base.

    En un entorno de producción, es posible que elijas agregar cada operación permitida por separado, en lugar de usar esta expresión de ruta de acceso comodín.

  7. Haz clic en Guardar para guardar la operación.

  8. Para guardar el producto de API, haz clic en Guardar en la parte superior de la página Detalles del producto.

  9. Vuelve a la página Distribución > Productos de API.

    Se mostrará el producto de API en la lista.

Crea un desarrollador de apps

Antes de crear una app, debes crear un desarrollador de apps.

  1. En el menú de navegación de la izquierda, haz clic en Distribución > Desarrolladores.

  2. Para crear un nuevo desarrollador de apps, haz clic en +Crear.

  3. Especifica lo siguiente:

    Propiedad Valor
    Nombre Joe
    Apellido Desarrollador
    Nombre de usuario joe
    Correo electrónico joe@example.com
  4. Haz clic en Agregar para crear el desarrollador de apps.

Crea una app con acceso a bank-v1

  1. En el menú de navegación de la izquierda, haz clic en Distribución > Apps.

  2. Para crear una app nueva, haz clic en +Crear.

  3. En el panel Detalles de la app, especifica lo siguiente:

    Propiedad Valor
    Nombre readonly-app
    Desarrollador selecciona joe@example.com
  4. En el panel Credenciales, haz clic en Agregar credenciales > Agregar productos, selecciona banco (acceso de lectura) en el menú desplegable y, luego, haz clic en Agregar para agregarla.

  5. Haz clic en Crear en la esquina superior derecha para crear la app.

    Ahora, la clave y el secreto están configurados para la app.

  6. Haz clic en los íconos de Mostrar junto a Clave y Secreto.

    Para esta API, se requiere un token de acceso de OAuth. La clave y el secreto se usarán como credenciales para la app, que le permite crear un token de acceso de OAuth.

Haz clic en Revisar mi progreso para verificar el objetivo. Agregar el producto de API y crea una app

Prueba la API

  1. En Cloud Shell, abre una conexión SSH a tu VM de prueba:

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite

    Si se te solicita autorización, haz clic en Autorizar.

    Tu sesión de Cloud Shell ahora se ejecuta dentro de la VM.

  2. Para obtener el secreto y la clave de consumidor de la aplicación, ejecuta los siguientes comandos:

    export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null); echo "PROJECT_ID=${PROJECT_ID}" export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output); echo "CONSUMER_KEY=${CONSUMER_KEY}" export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output); echo "CONSUMER_SECRET=${CONSUMER_SECRET}"

    El primer comando lee la configuración de gcloud para obtener el proyecto actual. El segundo y el tercer comando recuperan el secreto y la clave de consumidor con la API de Apigee. La solicitud se autoriza porque envías un token de acceso que tiene los permisos del usuario que ingresó a la cuenta.

    Para el tipo de otorgamiento de credenciales de cliente de OAuth, la aplicación cliente debe enviar el secreto y la clave de consumidor en un encabezado de autorización con el objetivo de generar un token de acceso.

  3. Para generar un token de acceso JWT, ejecuta el siguiente comando:

    export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials"); echo ${TOKEN_RESPONSE} export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output); echo "JWT_TOKEN=${JWT_TOKEN}"

    El primer comando llama al extremo del token y guarda la respuesta. Luego, el token se extrae de la respuesta JSON y se almacena en JWT_TOKEN.

  4. Para probar una solicitud con el token JWT, usa el siguiente comando:

    curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/customers"

    La llamada a la API ahora debería devolver una lista de clientes.

    Nota: Si recibes una respuesta que indica que "Tu cliente no tiene permiso para la URL solicitada", verifica que el público (Audience) se haya configurado correctamente en la tarea 1.
  5. Ingresa el comando exit para salir de la sesión de SSH y regresar a Cloud Shell.

Tarea 6: Agrega un límite de frecuencia

En esta tarea, agregarás una política de SpikeArrest que usará la configuración de cuota del producto de API para limitar la frecuencia de las llamadas a la API.

La política de SpikeArrest protege tus APIs y backends contra los aumentos repentinos de tráfico, ya que te permite especificar una tasa máxima de tráfico permitida. Esta política se puede usar para garantizar que tu backend no se vea sobrecargado por el tráfico que no puede controlar.

Agrega una política de SpikeArrest para la generación de tokens

Esta política de SpikeArrest especificará un límite de frecuencia general para el tráfico de llamadas a la API de /token.

  1. Navega a Apigee en la consola de Cloud.

  2. En el menú de navegación de la izquierda, selecciona Desarrollo de proxy > Proxies de API y, luego, haz clic en bank-v1.

  3. Haz clic en la pestaña Desarrollar.

  4. En el menú Navegador del proxy, en la sección Extremos de proxy, en token, haz clic en PreFlow.

    La política de SpikeArrest debe ejecutarse antes de las políticas de flujo condicional.

  5. En el panel Flujo, haz clic en el botón + junto a PreFlow del flujo de solicitud.

  6. Selecciona Crear una política nueva y SpikeArrest en la sección Administración del tráfico. Luego, establece SA-LimitTokenRate como Nombre visible y Nombre.

  7. Haz clic en Agregar y, luego, en SA-LimitTokenRate en la sección Políticas.

    La configuración de la política de SpikeArrest se muestra en el panel Código.

  8. Cambia la configuración de la política de SpikeArrest a lo siguiente:

    <SpikeArrest name="SA-LimitTokenRate"> <Rate>5pm</Rate> <UseEffectiveCount>false</UseEffectiveCount> </SpikeArrest>

    La configuración especifica que la tasa máxima de solicitudes permitida es de 5 por minuto. Todo el tráfico estará limitado por esta política de SpikeArrest.

    Nota: Se usan 5 solicitudes por minuto para facilitar las pruebas. Por lo general, los límites de SpikeArrest en este lab son demasiado bajos para situaciones reales.

    Si UseEffectiveCount se establece como falso, se especifica que la política de SpikeArrest usa el algoritmo de bucket de tokens. El tráfico se reduce dividiendo la tasa en intervalos más pequeños. 5 solicitudes por minuto significa 1 solicitud por cada quinto de minuto o 1 solicitud cada 12 segundos. Cuando llega una segunda solicitud a un Message Processor en menos de 12 segundos después de la anterior, es posible que se rechace.

Agrega una política de SpikeArrest para las solicitudes a la API

Esta política de SpikeArrest especificará un límite de frecuencia para el tráfico de llamadas a la API de /bank/v1. La tasa se establecerá por aplicación.

  1. En el menú Navegador del proxy, en la sección Extremos de proxy, en predeterminado, haz clic en PreFlow.

    La política de SpikeArrest debe ejecutarse al principio de la llamada, pero debe hacerlo después de la política de OAuthV2 VerifyJWTAccessToken para limitar la tasa por aplicación.

  2. En el panel Flujo, haz clic en el botón + junto a PreFlow del flujo de solicitud.

  3. Selecciona Crear una política nueva y SpikeArrest en la sección Administración del tráfico. Luego, establece SA-LimitRateByApp como Nombre visible y Nombre.

  4. Haz clic en Agregar y, luego, en SA-LimitRateByApp en la sección Políticas.

    La configuración de la política de SpikeArrest se muestra en el panel Código.

  5. Cambia la configuración de la política de SpikeArrest a lo siguiente:

    <SpikeArrest name="SA-LimitRateByApp"> <Rate>5pm</Rate> <Identifier ref="client_id" /> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>

    Al igual que la política anterior, la configuración especifica que la tasa máxima de solicitudes permitida es de 5 por minuto. Sin embargo, esta política especifica un Identificador, que mantiene la tasa de SpikeArrest por separado para cada client_id. El ID de cliente se completa con la política de OA-VerifyToken y es único para cada aplicación del desarrollador.

    Si UseEffectiveCount se establece como verdadero, se especifica que el recuento de la tasa se mantiene para todo el tráfico dentro de la región. La política mantiene un contador de las solicitudes recibidas por período, que dura un minuto cuando se usa una tasa de solicitudes por minuto. El cálculo de la tasa se basa en una ventana deslizante.

    Ejemplo de una ventana deslizante, con la tasa de 48 y 5.

    Para este ejemplo que se muestra arriba, supongamos que usamos una frecuencia de 50 solicitudes por minuto. Los contadores usan un período de un minuto, aunque el período del contador sería de un segundo si la tasa se hubiera especificado por segundo. Supongamos que pasaron 10 segundos del minuto actual, representado por la flecha. En el minuto anterior, hubo 48 solicitudes, y en el período actual, hubo 5 solicitudes hasta el momento.

    Para permitir otra solicitud, la frecuencia debería ser inferior a 50 solicitudes por minuto. La tasa calculada es la siguiente:

    request_rate = (48 * (60-10)/60) + 6 = 46

    Dado que solo transcurrieron 10 segundos de los 60 del período actual, los otros 50 segundos se calculan con la tasa del período anterior. 5/6 de 48 es 40. Si se permitiera una solicitud, el recuento para el período actual sería de 5 + 1, es decir, 6. El cálculo de la frecuencia de solicitudes de 46 indica que la solicitud está permitida, ya que la frecuencia de solicitudes es inferior a 50 solicitudes por minuto.

  6. Haz clic en Guardar > Guardar como revisión nueva.

  7. Haz clic en Implementar y, luego, selecciona evaluación en Entorno.

  8. En Cuenta de servicio, especifica la dirección de correo electrónico de la cuenta de servicio:

apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
  1. Haz clic en Implementar y, luego, en Confirmar.
  2. Haz clic en la pestaña Descripción general y espera a que el estado de implementación de evaluación muestre que se implementó el proxy.

Haz clic en Revisar mi progreso para verificar el objetivo. Agregar la política de SpikeArrest

Prueba el límite de frecuencia

  1. En Cloud Shell, abre una conexión SSH a tu VM de prueba:

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite

    Si se te solicita autorización, haz clic en Autorizar.

    Tu sesión de Cloud Shell ahora se ejecuta dentro de la VM.

  2. Para obtener el secreto y la clave de consumidor de la aplicación, ejecuta los siguientes comandos:

    export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null); echo "PROJECT_ID=${PROJECT_ID}" export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output); echo "CONSUMER_KEY=${CONSUMER_KEY}" export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output); echo "CONSUMER_SECRET=${CONSUMER_SECRET}"
  3. Ejecuta el siguiente comando varias veces para generar varios tokens de acceso:

    curl -i -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials"

    Deberías recibir rápidamente una respuesta 429 Demasiadas solicitudes, que indica que se superó la tasa. Dado que UseEffectiveCount es falso para esta política, el tráfico se reduce con el algoritmo de bucket de tokens. Es probable que recibas el incumplimiento de la protección contra aumentos repentinos de tráfico antes de la 5ª solicitud.

  4. Para guardar un token de acceso JWT, ejecuta el siguiente comando:

    export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials"); echo ${TOKEN_RESPONSE} export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output); echo "JWT_TOKEN=${JWT_TOKEN}"
  5. Para probar la política de SpikeArrest en las llamadas a la API, envía el siguiente comando de forma repetida:

    curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/customers"

    UseEffectiveCount es verdadero, por lo que esta política usa el algoritmo de ventana deslizante. Deberías poder realizar 5 solicitudes correctamente antes de que se bloquee una.

  6. Ingresa el comando exit para salir de la sesión de SSH y regresar a Cloud Shell.

Tarea 7: Enmascara datos

En esta tarea, crearás una máscara de datos para ocultar campos específicos en una sesión de depuración.

Inicia una sesión de depuración

La depuración es una herramienta para solucionar problemas y supervisar proxies de API que se ejecutan en Apigee. La herramienta de depuración te permite examinar los detalles de cada paso durante una llamada a la API.

  1. En el menú de navegación de la izquierda, selecciona Desarrollo de proxy > Proxies de API y, luego, haz clic en bank-v1.

  2. Haz clic en la pestaña Depurar.

  3. En el panel Iniciar sesión de depuración, haz clic en Iniciar sesión de depuración y, en el menú desplegable del entorno, selecciona el entorno evaluación.

  4. Haz clic en Iniciar.

    Es posible que la sesión de depuración demore unos instantes en comenzar a capturar solicitudes.

    Nota: Si ves mensajes de error en cuadros rojos cerca de la parte superior de la pantalla, con descripciones como "Error cuando se recuperaban transacciones de depuración" o "Error de transacción de enumeración de sesiones de depuración", es posible que tu sesión de depuración siga funcionando correctamente.

    Realizarás solicitudes a la API y, luego, examinarás la sesión de depuración.

Depura una solicitud

  1. En Cloud Shell, abre una conexión SSH a tu VM de prueba:

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite

    Si se te solicita autorización, haz clic en Autorizar.

    Tu sesión de Cloud Shell ahora se ejecuta dentro de la VM.

  2. Para obtener el token de la aplicación, ejecuta los siguientes comandos:

    export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null); echo "PROJECT_ID=${PROJECT_ID}" export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output); echo "CONSUMER_KEY=${CONSUMER_KEY}" export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output); echo "CONSUMER_SECRET=${CONSUMER_SECRET}" export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials"); echo ${TOKEN_RESPONSE} export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output); echo "JWT_TOKEN=${JWT_TOKEN}"
  3. Realiza esta solicitud a la API:

    curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/customers/abe@example.org/accounts"
  4. Regresa a la página de IU de Apigee.

    La página Depurar debería mostrar 2 solicitudes: una POST (para generar el token) y una GET (para recuperar las cuentas de un usuario).

  5. Haz clic en la solicitud GET.

    Se muestran los detalles de la solicitud GET.

  6. Haz clic en la primera política, que es la política AM-GetSecret que copia la variable propertyset.oauth.secret en la variable private.secretkey.

    La página de IU de Apigee, con el ícono de AssignMessage y la descripción de variables leídas destacadas.

    En los Detalles de la fase no se muestra la variable privada, ya que las variables que tienen el prefijo "private." se ocultan en la sesión de depuración. Sin embargo, la variable de conjunto de propiedades contiene los mismos datos sensibles, por lo que podría ser conveniente ocultarla a los usuarios que depuran el tráfico.

  7. Haz clic en la respuesta del backend, que se indica con el círculo a la izquierda del ícono de fábrica.

    El botón de activación del backend destacado dentro de la categoría Mapa de transacciones, junto con el texto del cuerpo destacado en el contenido de la respuesta.

    La respuesta contiene las cuentas del usuario, incluidos los saldos de cuenta.

Crea una máscara de depuración

  1. Abre una pestaña nueva en la misma ventana del navegador y desplázate a la referencia de la API de Apigee.

    La referencia de la API de Apigee proporciona detalles sobre las diversas llamadas a la API que se pueden usar para administrar Apigee y también para realizar llamadas a la API de Apigee. En esta página, se muestran las llamadas a la API de organization.environments.

  2. Desplácese hasta el final de la página y haga clic en updateDebugmask.

    Esta llamada a la API actualizará la máscara de depuración del entorno.

  3. En el panel Probar esta API, para el parámetro de solicitud name, usa lo siguiente:

    organizations/{{{ project_0.project_id | PROJECT }}}/environments/eval/debugmask
  4. Para el cuerpo de la solicitud, ingresa lo siguiente:

    { "responseJSONPaths": [ "$[*].balance" ], "variables": [ "propertyset.oauth.secret" ] }

    Esta carga útil hará que se enmascare la variable propertyset.oauth.secret y también cada campo saldo del array de objetos en la carga útil de la respuesta.

  5. Haz clic en Ejecutar.

    Si aparece un cuadro emergente que te pide que elijas tu cuenta, selecciona la cuenta de estudiante.

  6. Haz clic en Permitir para permitir que la página use las credenciales de estudiante.

Prueba la máscara de depuración

  1. En la IU de Apigee, en el menú de navegación de la izquierda, selecciona Desarrollo de proxy > Proxies de API y, luego, haz clic en bank-v1.

  2. Haz clic en la pestaña Depurar.

  3. En el panel Iniciar sesión de depuración, en el menú desplegable del entorno, selecciona evaluación.

  4. Haz clic en Iniciar.

  5. En Cloud Shell, si se cerró la conexión SSH, abre una conexión SSH a tu VM de prueba:

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
  6. Obtén un token y vuelve a realizar la solicitud a la API:

    export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null) export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output) export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output) export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials") export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output) curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/customers/abe@example.org/accounts"
  7. Regresa a la página Depurar en la IU de Apigee y haz clic en la solicitud GET.

  8. Haz clic en la política AM-GetSecret.

    La variable propertyset.oauth.secret está enmascarada.

    La variable propertyset.oauth.secret en modo oculto.

  9. Haz clic en Se inició el flujo de respuesta del proxy para ver la respuesta del backend.

    Cada campo de saldo está enmascarado.

    Los campos de saldo ocultos en el texto del cuerpo.

Tarea 8: Maneja errores

En esta tarea, crearás un flujo condicional predeterminado para restringir las llamadas a recursos de backend específicos y volverás a escribir un mensaje de error de backend.

Prueba la API

  1. En Cloud Shell, si se cerró la conexión SSH, abre una conexión SSH a tu VM de prueba:

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
  2. Ingresa Y para continuar y presiona INTRO dos veces de modo de dejar la frase de contraseña vacía.

  3. Obtén un token y realiza una solicitud GET a /users:

    export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null) export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output) export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output) export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials") export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output) curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/users"

    El servicio de backend no reconoce la solicitud GET /users, por lo que devuelve una respuesta 404 similar a la siguiente:

    HTTP/2 404 x-powered-by: Express content-security-policy: default-src 'none' x-content-type-options: nosniff content-type: text/html; charset=utf-8 x-cloud-trace-context: 7e96528757cc5053ba4fc8853037b02d;o=1 date: Wed, 19 Jan 2022 01:49:53 GMT server: Google Frontend content-length: 144 x-request-id: 2d8c8002-3152-4fc2-a60b-1729dd5483d8 via: 1.1 google <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Error</title> </head> <body> <pre>Cannot GET /users</pre> </body> </html>

    La respuesta devuelve una carga útil HTML, que no coincide con el formato de la carga útil de RF-InvalidTokenRequest. Además, una respuesta del backend puede contener datos sensibles. Por estos motivos, una práctica que se recomienda es volver a escribir las respuestas de error de los servicios de backend.

Vuelve a escribir un error 404 No encontrado

Las reglas de falla se pueden usar para detectar errores y volver a escribir mensajes de error.

Se usará una política RaiseFault para establecer la nueva respuesta.

  1. Navega a Apigee en la consola de Cloud.

  2. En el menú de navegación de la izquierda, selecciona Desarrollo de proxy > Proxies de API y, luego, haz clic en bank-v1.

  3. Haz clic en la pestaña Desarrollar.

  4. En el menú Navegador del proxy, junto a Políticas, haz clic en +.

  5. Selecciona Generar una falla en la sección Mediación y, luego, establece RF-404NotFound como Nombre visible y Nombre.

  6. Haz clic en Crear. Haz clic en RF-404NotFound en la sección Políticas.

  7. Cambia la configuración de la política RaiseFault a la siguiente:

    <RaiseFault name="RF-404NotFound"> <FaultResponse> <Remove> <Headers/> </Remove> <Set> <StatusCode>404</StatusCode> <ReasonPhrase>Not Found</ReasonPhrase> <Headers> <Header name="FaultName">{fault.name}</Header> </Headers> <Payload contentType="application/json">{ "error": "{request.verb} {proxy.pathsuffix} not found" }</Payload> </Set> </FaultResponse> <AssignTo createNew="true" type="response"/> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </RaiseFault>

    En la sección Quitar, primero se quitan todos los encabezados que podrían haber provenido del servicio de backend y, luego, en la sección Establecer, se crea la respuesta. Se agregó el encabezado FaultName para mostrar el valor de la variable fault.name cuando se genera la falla. La variable fault.name especifica el nombre de la falla.

Crea la regla FaultRule

  1. En el menú Navegador del proxy, en la sección Extremos de destino, haz clic en predeterminado.

    El extremo de destino predeterminado contiene la llamada de destino del backend que devuelve la respuesta 404. Un error 404 se considera un código de falla. El extremo generará una falla y se podrán usar las FaultRules especificadas en el extremo de destino para volver a escribir la respuesta de la API.

  2. En la configuración de TargetEndpoint, directamente debajo de la etiqueta TargetEndpoint, agrega la siguiente sección FaultRules:

    <FaultRules> <FaultRule name="404"> <Step> <Name>RF-404NotFound</Name> </Step> <Condition>response.status.code == 404</Condition> </FaultRule> </FaultRules>

    El comienzo de TargetEndpoint ahora se verá similar a lo siguiente:

    <TargetEndpoint name="default"> <FaultRules> <FaultRule name="404"> <Step> <Name>RF-404NotFound</Name> </Step> <Condition>response.status.code == 404</Condition> </FaultRule> </FaultRules>
  3. Haz clic en Guardar > Guardar como revisión nueva.

  4. Haz clic en Implementar y selecciona evaluación en Entorno.

  5. En Cuenta de servicio, especifica la dirección de correo electrónico de la cuenta de servicio:

    apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
  6. Haz clic en Implementar y, luego, en Confirmar.

  7. Haz clic en la pestaña Descripción general y espera a que el estado de implementación de evaluación muestre que se implementó el proxy.

Prueba la falla en la respuesta del extremo

  1. En Cloud Shell, si se cerró la conexión SSH, abre una conexión SSH a tu VM de prueba:

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
  2. Obtén un token y realiza una solicitud GET a /users:

    export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null) export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output) export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output) export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials") export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output) curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/users"

    La respuesta se reescribió y ahora se ve similar a lo siguiente:

    HTTP/2 404 faultname: ErrorResponseCode content-type: application/json x-request-id: 8d9db301-b3c7-4957-816d-93e796306dfb content-length: 39 date: Tue, 18 Jan 2022 06:42:23 GMT via: 1.1 google { "error": "GET /users not found" }

    La respuesta ahora usa JSON. Ten en cuenta que el encabezado faultname tiene el valor ErrorResponseCode, que es el valor de la variable fault.name especificada cuando el destino devuelve un código de error. En cuanto el servicio de backend devolvió la respuesta 404, se generó una falla y se evaluaron las reglas de falla del extremo de destino. Luego, la regla de error 404 reescribió la respuesta.

Agrega un flujo condicional 404

En lugar de contar con que el backend devuelva una respuesta cuando se envía una solicitud inesperada, se puede agregar un nuevo flujo condicional al final de los flujos condicionales del extremo de proxy para generar una falla cuando ninguno de los otros flujos condicionales coincida con sus condiciones. Esto garantiza que solo las operaciones que se enumeran en los flujos condicionales pasarán al backend. Este patrón te deja permitir el acceso solo a un subconjunto de los recursos del servicio de backend.

  1. En el menú Navegador del proxy, navega a Extremo de proxy: predeterminado y, luego, en la sección de flujo, haz clic en + junto a /bank/v1.

  2. Para el nuevo flujo condicional, especifica los siguientes valores:

    Propiedad Valor
    Nombre del flujo 404NotFound
    Tipo de condición selecciona Personalizada
    Condición DELETETHIS
  3. Haz clic en Agregar.

  4. En el flujo 404NotFound, quita la siguiente línea:

    <Condition>DELETETHIS</Condition>

    Si no coinciden todas las condiciones de los flujos condicionales anteriores, se ejecutará el flujo 404NotFound.

  5. En el menú Navegador del proxy, en la sección Extremos de proxy, en predeterminado, haz clic en 404NotFound.

  6. En el panel Flujo, haz clic en el botón + junto al flujo de solicitud 404NotFound.

  7. En Seleccionar política, elige la opción Seleccionar política existente y, luego, haz clic en RF-404NotFound.

  8. Haz clic en Agregar.

  9. Haz clic en Guardar > Guardar como revisión nueva.

  10. Haz clic en Implementar y, luego, selecciona evaluación en Entorno.

  11. En Cuenta de servicio, especifica la dirección de correo electrónico de la cuenta de servicio:

    apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
  12. Haz clic en Implementar y, luego, en Confirmar.

  13. Haz clic en la pestaña Descripción general y espera a que el estado de implementación de evaluación muestre que se implementó el proxy.

Haz clic en Revisar mi progreso para verificar el objetivo. Agregar manejo de errores

Prueba el flujo condicional 404

  1. En Cloud Shell, si se cerró la conexión SSH, abre una conexión SSH a tu VM de prueba:

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
  2. Obtén un token y realiza una solicitud GET a /users:

    export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null) export CONSUMER_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output) export CONSUMER_SECRET=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerSecret" --raw-output) export TOKEN_RESPONSE=$(curl -k -u "${CONSUMER_KEY}:${CONSUMER_SECRET}" -X POST "https://eval.example.com/token" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials") export JWT_TOKEN=$(echo ${TOKEN_RESPONSE} | jq ".access_token" --raw-output) curl -i -k -H "Authorization: Bearer ${JWT_TOKEN}" -X GET "https://eval.example.com/bank/v1/users"

    La respuesta se reescribió y ahora se ve similar a lo siguiente:

    HTTP/2 404 faultname: RaiseFault content-type: application/json x-request-id: d6bbd48f-65bd-4551-9236-636fad03a609 content-length: 39 date: Tue, 18 Jan 2022 07:07:58 GMT via: 1.1 google alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 { "error": "GET /users not found" }

    El encabezado faultname ahora tiene el valor RaiseFault, que es el valor de fault.name que se usa cuando una política RaiseFault provocó que se generara la falla. La política RaiseFault en el flujo condicional 404NotFound generó la respuesta.

¡Felicitaciones!

En este lab, protegiste una API solicitando un token de OAuth de JWT. Limitaste el tráfico agregando políticas de SpikeArrest. Usaste variables privadas y enmascaramiento de datos para ocultar datos sensibles en sesiones de depuración. También volviste a escribir un mensaje de error de backend y usaste un flujo condicional 404 para restringir las llamadas al backend a recursos específicos.

Próximos pasos/Más información

Última actualización del manual: 6 de agosto de 2025

Prueba más reciente del lab: 6 de agosto de 2025

Copyright 2026 Google LLC. All rights reserved. Google y el logotipo de Google son marcas de Google LLC. Los demás nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que estén asociados.

Antes de comenzar

  1. Los labs crean un proyecto de Google Cloud y recursos por un tiempo determinado
  2. .
  3. Los labs tienen un límite de tiempo y no tienen la función de pausa. Si finalizas el lab, deberás reiniciarlo desde el principio.
  4. En la parte superior izquierda de la pantalla, haz clic en Comenzar lab para empezar

Usa la navegación privada

  1. Copia el nombre de usuario y la contraseña proporcionados para el lab
  2. Haz clic en Abrir la consola en modo privado

Accede a la consola

  1. Accede con tus credenciales del lab. Si usas otras credenciales, se generarán errores o se incurrirá en cargos.
  2. Acepta las condiciones y omite la página de recursos de recuperación
  3. No hagas clic en Finalizar lab, a menos que lo hayas terminado o quieras reiniciarlo, ya que se borrará tu trabajo y se quitará el proyecto

Este contenido no está disponible en este momento

Te enviaremos una notificación por correo electrónico cuando esté disponible

¡Genial!

Nos comunicaremos contigo por correo electrónico si está disponible

Un lab a la vez

Confirma para finalizar todos los labs existentes y comenzar este

Usa la navegación privada para ejecutar el lab

Usar una ventana de incógnito o de navegación privada es la mejor forma de ejecutar este lab. Así evitarás cualquier conflicto entre tu cuenta personal y la cuenta de estudiante, lo que podría generar cargos adicionales en tu cuenta personal.