Saltar al contenido principal
Google Cloud Endpoints (GCE) es un sistema de gestión de API que ofrece funciones para ayudarle a crear, mantener y proteger sus API. GCE usa OpenAPI para definir los endpoints, las entradas y salidas, los errores y la descripción de seguridad de su API. Para obtener más información sobre la especificación OpenAPI, consulte el repositorio OpenAPI Specification en GitHub. En este tutorial se explica cómo proteger Google Cloud Endpoints con Auth0.

Requisitos previos

Antes de comenzar, necesitarás una API de GCE ya implementada. Si aún no has creado una API, completa la guía de inicio rápido de Cloud Endpoints disponible en la documentación de Google. La guía de inicio rápido te mostrará cómo crear una API de GCE sencilla con un único endpoint, /airportName, que devuelve el nombre de un aeropuerto a partir de su código IATA de tres letras.

Defina la API en Auth0

Vaya a Auth0 Dashboard > Applications > APIs y cree una API nueva.
Dashboard - Crear API - Integraciones - Google Endpoints
Tome nota del identificador de la Audiencia de la API (http://google_api en la captura de pantalla anterior) para usarlo en el siguiente paso.

Actualiza la configuración de la API

A continuación, actualizaremos el archivo de configuración de OpenAPI de la API de GCE. En la API de ejemplo creada durante la guía de inicio rápido, este archivo es openapi.yaml.

Agregar definiciones de seguridad

Abra el archivo de configuración y agregue una nueva sección securityDefinitions. En esta sección, agregue una nueva definición (auth0_jwt) con los siguientes campos:
FieldDescription
authorizationUrlLa URL de autorización; debe establecerse como "https://{yourDomain}/authorize"
flowEl flujo que utiliza el esquema de seguridad OAuth2. Los valores válidos son "implicit", "password", "application" o "accessCode".
typeEl tipo de esquema de seguridad. Los valores válidos son "basic", "apiKey" o "oauth2"
x-google-issuerEl emisor de una credencial; debe establecerse como "https://{yourDomain}/"
x-google-jwks_uriEl URI del conjunto de claves públicas para validar la firma del JSON Web Token (JWT). Establézcalo como "https://\{yourDomain}/.well-known/jwks.json"
x-google-audiencesEl identificador de la API; asegúrese de que este valor coincida con el que configuró en el Auth0 Dashboard para la API.

Actualiza el endpoint

Ahora, actualiza el endpoint añadiendo un campo security con la securityDefinition que creamos en el paso anterior.
paths:
  "/airportName":
    get:
      description: "Get the airport name for a given IATA code."
      operationId: "airportName"
      parameters:
        -
          name: iataCode
          in: query
          required: true
          type: string
      responses:
        200:
          description: "Success."
          schema:
            type: string
        400:
          description: "The IATA code is invalid or missing."
      security:
       - auth0_jwt: []
En el ejemplo anterior, el campo security indica al proxy de GCE que nuestra ruta /airportName debe estar protegida con la definición auth0-jwt. Después de actualizar la configuración de OpenAPI, debería verse más o menos así:

Volver a desplegar la API

A continuación, vuelva a desplegar su API de GCE para aplicar los cambios de configuración. Si siguió la guía de inicio rápido de Cloud Endpoints, puede volver a desplegarla introduciendo lo siguiente en Cloud Shell de Google:
cd endpoints-quickstart/scripts
./deploy_api.sh

Prueba la API

Una vez que la hayas vuelto a implementar, llama a la API de nuevo sin seguridad. Obtendrás la siguiente respuesta:
{
 "code": 16,
 "message": "JWT validation failed: Missing or invalid credentials",
 "details": [
  {
   "@type": "type.googleapis.com/google.rpc.DebugInfo",
   "stackEntries": [],
   "detail": "auth"
  }
 ]
}
¡Eso es exactamente lo que queremos! Ahora ve a la página Test de la definición de tu API de Google Endpoints en el Auth0 Dashboard y copia el de la respuesta: Realiza una solicitud GET a tu API con un encabezado Authorization de Bearer {ACCESS_TOKEN} para obtener acceso autorizado: ¡Eso es todo!