Passer au contenu principal
Google Cloud Endpoints (GCE) est un système de gestion d’API offrant des fonctionnalités pour vous aider à créer, maintenir et sécuriser vos API. GCE utilise OpenAPI pour définir les points de terminaison, les entrées et les sorties, les erreurs et la description de la sécurité de votre API. Pour plus d’informations sur la spécification OpenAPI, voir le référentiel de spécification OpenAPI sur GitHub. Ce tutoriel explique comment sécuriser Google Cloud Endpoints avec Auth0.

Prérequis

Avant de commencer, vous aurez besoin d’une API GCE déployée. Si vous n’avez pas encore créé d’API, suivez le Guide de démarrage rapide de Cloud Endpoints qui se trouve dans la documentation de Google. Le guide de démarrage rapide vous guidera à travers la création d’une API GCE simple avec un seul point de terminaison, /airportName, qui renvoie le nom d’un aéroport à partir de son code IATA de trois lettres.
curl --request GET \
  --url 'https://%7ByourGceProject%7D.appspot.com/airportName?iataCode=SFO'

Définir l’API dans Auth0

Allez dans Tableau de bord Auth0 > Applications > API, et créez une nouvelle API.
Dashboard – Créer API – Intégrations – Points finaux Google
Notez l’identifiant d’ de l’API (http://google_apidans la capture d’écran ci-dessus) à utiliser à l’étape suivante.

Mettre à jour la configuration de l’API

Ensuite, nous mettrons à jour le fichier de configuration OpenAPI pour l’API GCE. Pour l’exemple d’API créé lors du démarrage rapide, ce fichier est openapi.yaml.

Ajouter des définitions de sécurité

Ouvrez le fichier de configuration et ajoutez une nouvelle section securityDefinitions. Dans cette section, ajoutez une nouvelle définition (auth0_jwt) avec les champs suivants :
ChampDescription
authorizationUrlL’URL d’autorisation, doit être définie sur "https://{yourDomain}/authorize"
flowLe flux utilisé par le schéma de sécurité OAuth2. Les valeurs valides sont "implicit", "password", "application" ou "accessCode".
typeLe type du schéma de sécurité. Les valeurs valides sont "basic", "apiKey" ou "oauth2"
x-google-issuerL’émetteur d’un identifiant, doit être défini sur "https://{yourDomain}/"
x-google-jwks_uriL’URI de la clé publique définie pour valider la signature JSON Web Token (JWT). Définissez ceci sur "https://{yourDomain}/.well-known/jwks.json"
x-google-audiencesL’identifiant de l’API, assurez-vous que cette valeur correspond à ce que vous avez défini dans Auth0 Dashboard pour l’API.
codeblockOld.header.login.logInButton codeblockOld.header.login.configureSnippet
securityDefinitions:
  auth0_jwt:
    authorizationUrl: "https://{yourDomain}/authorize"
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "https://{yourDomain}/"
    x-google-jwks_uri: "https://{yourDomain}/.well-known/jwks.json"
    x-google-audiences: "{yourApiIdentifier}"

Mettre à jour le point de terminaison

Maintenant, mettez à jour le point de terminaison en ajoutant un champ security avec la section securityDefinition que nous avons créée à l’étape précédente.
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: []
Dans l’exemple ci-dessus, le champ security indique au proxy GCE que notre chemin /airportName s’attend à être sécurisé avec la définition auth0-jwt. Après la mise à jour de la configuration OpenAPI, elle devrait ressembler à ceci : codeblockOld.header.login.logInButton codeblockOld.header.login.configureSnippet
---
swagger: "2.0"
info:
  title: "Airport Codes"
  description: "Get the name of an airport from its three-letter IATA code."
  version: "1.0.0"
host: "{yourGceProject}.appspot.com"
schemes:
  - "https"
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: []
securityDefinitions:
  auth0_jwt:
    authorizationUrl: "https://{yourDomain}/authorize"
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "https://{yourDomain}/"
    x-google-jwks_uri: "https://{yourDomain}/.well-known/jwks.json"
    x-google-audiences: "{yourApiIdentifier}"

Redéployer l’API

Ensuite, redéployez votre API GCE pour appliquer les changements de configuration. Si vous avez suivi le Guide de démarrage rapide de Cloud Endpoints, vous pouvez redéployer l’API en saisissant les éléments suivants dans le Cloud Shell de Google :
cd endpoints-quickstart/scripts
./deploy_api.sh

Tester l’API

Une fois que vous avez redéployé l’API, appelez à nouveau l’API sans sécurité.
curl --request GET \
  --url 'https://%7ByourGceProject%7D.appspot.com/airportName?iataCode=SFO'
Vous obtiendrez la réponse suivante :
{
 "code": 16,
 "message": "JWT validation failed: Missing or invalid credentials",
 "details": [
  {
   "@type": "type.googleapis.com/google.rpc.DebugInfo",
   "stackEntries": [],
   "detail": "auth"
  }
 ]
}
Et c’est exactement ce que l’on veut! Accédez maintenant à la page Test de la définition de votre API Google Endpoints sur le Auth0 Dashboard et copiez le jeton d’accès sous la réponse : Effectuez une demande GET à votre API avec un en-tête d’autorisation du Bearer {ACCESS_TOKEN} pour obtenir un accès autorisé :
curl --request GET \
  --url 'https://%7ByourGceProject%7D.appspot.com/airportName?iataCode=SFO' \
  --header 'authorization: Bearer {accessToken}'
Et voilà!
I