Obtenir des identifiants éphémères avec la fédération d'identité

Ce guide explique comment obtenir des identifiants éphémères en utilisant un pool d'identités de charges de travail et un fournisseur, en procédant comme suit :

  1. Obtenez des identifiants auprès du fournisseur d'identité approuvé.
  2. Échangez les identifiants contre un jeton du service de jetons de sécurité.
  3. Utilisez le jeton du service de jetons de sécurité pour emprunter l'identité d'un compte de service et obtenir un jeton d'accès Google éphémère.

À l'aide des jetons d'accès Google éphémères, vous pouvez ensuite accéder à toutes les ressources Google Cloud auxquelles le compte de service a été autorisé à accéder.

Avant de commencer

  1. Fédérez avec un fournisseur d'identité externe en créant un pool et un fournisseur de fédération d'identité de charge de travail
  2. Créez un compte de service pour lequel vous souhaitez que les identités externes empruntent l'identité.
  3. Accordez au compte de service l'accès aux ressources auxquelles vous souhaitez que les identités externes accèdent.

Accorder aux identités externes l'autorisation d'emprunter l'identité d'un compte de service

Pour autoriser les identités externes à emprunter l'identité d'un compte de service, vous devez leur accorder le rôle d'utilisateur Workload Identity (roles/iam.workloadIdentityUser) sur le compte de service. Vous pouvez accorder le rôle à une identité externe spécifique ou à plusieurs identités externes :

  • Pour une identité externe spécifique, écrivez une condition d'attribut qui vérifie l'attribut google.subject.
  • Pour un groupe d'identités externes, créez une condition d'attribut qui vérifie l'attribut google.groups ou un attribut personnalisé attribute.NAME.
  • Pour toutes les identités externes du pool d'identités de charge de travail, vous n'utilisez pas de condition d'attribut.

Console

  1. Dans Cloud Console, accédez à la page Pools d'identités de charge de travail.

    Accéder aux pools d'identité de charge de travail

  2. Recherchez le pool d'identités de charge de travail contenant les identités Azure, puis cliquez sur Modifier.

  3. Cliquez sur Accorder l'accès.

  4. Dans la liste déroulante Compte de service, sélectionnez le compte de service dont les identités externes seront empruntées.

  5. Choisissez les identités du pool qui peuvent emprunter l'identité du compte de service :

    • Pour n'autoriser que les identités spécifiques du pool d'identités de charge de travail à emprunter l'identité du compte de service, sélectionnez Uniquement les identités correspondant au filtre.

      Dans la liste déroulante Nom de l'attribut, sélectionnez l'attribut sur lequel vous souhaitez appliquer le filtre.

      Dans le champ Valeur de l'attribut, saisissez la valeur attendue de l'attribut.

      Par exemple, si vous utilisez un mappage d'attributs google.subject=assertion.sub, définissez le nom de l'attribut sur subject et la valeur d'attributsur la valeur de la revendication sub dans les jetons émis par votre fournisseur d'identité externe.

    • Pour autoriser toutes les identités externes du pool d'identités de charge de travail à emprunter l'identité du compte de service, sélectionnez Toutes les identités du pool.

  6. Cliquez sur Enregistrer.

  7. Cliquez sur Ignorer.

gcloud

  1. Créez un identifiant pour les identités externes :

    • Une identité externe spécifique :

      principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
      
    • Un groupe d'identités externes :

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
      
    • Toutes les identités externes ayant un certain attribut :

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
      
    • Toutes les identités externes d'un pool d'identités de charge de travail :

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
      

    Remplacez les valeurs suivantes :

    • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail
    • POOL_ID : ID de pool du pool d'identités de charge de travail
    • SUBJECT : valeur attendue pour l'attribut que vous avez mappé sur google.subject.
    • GROUP : valeur attendue pour l'attribut que vous avez mappé sur google.groups.
    • ATTRIBUTE_NAME : nom d'un attribut personnalisé dans votre mappage d'attributs

    Pour obtenir le numéro de projet de votre projet actuel, vous pouvez utiliser la commande suivante :

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Attribuez le rôle Utilisateur Workload Identity (roles/iam.workloadIdentityUser) au compte de service :

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="MEMBER_EXPRESSION"
    

    Remplacez les valeurs suivantes :

    • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service
    • MEMBER_ID : identifiant de membre que vous avez identifié à l'étape précédente

S'authentifier à l'aide de bibliothèques clientes ou de Terraform

Les bibliothèques clientes Cloud et Terraform peuvent obtenir automatiquement des identifiants externes et les utiliser pour emprunter l'identité d'un compte de service. Pour permettre aux bibliothèques de terminer ce processus, vous devez fournir un fichier de configuration des identifiants. Ce fichier définit les éléments suivants :

  • Où obtenir des identifiants externes
  • Quel pool d'identités de charge de travail et quel fournisseur utiliser
  • À quel compte de service emprunter l'identité

La manière dont les bibliothèques clientes utilisent les fichiers de configuration des identifiants dépend de votre fournisseur d'identité externe :

AWS

Les bibliothèques clientes obtiennent automatiquement des identifiants temporaires à partir des métadonnées d'instance EC2.

Azure

Les bibliothèques clientes obtiennent automatiquement des jetons d'accès à partir du service de métadonnées d'instance Azure (IMDS).

OIDC

Les bibliothèques clientes obtiennent des identifiants à partir d'un fichier local ou d'une URL HTTP :

  • Identifiants basés sur un fichier : les jetons sont chargés à partir d'un fichier. Un autre processus doit actualiser ce fichier avec un nouveau jeton OIDC avant l'expiration de l'ancien. Par exemple, si le jeton a une durée de vie d'une heure, vous devez actualiser le fichier avant qu'il soit obsolète.
  • Identifiants basés sur une URL : les jetons sont chargés à partir d'un serveur local avec un point de terminaison qui répond aux requêtes HTTP GET. La réponse doit être un jeton d'identification OIDC, au format texte brut ou au format JSON.

SAML

Les bibliothèques clientes obtiennent des identifiants à partir d'un fichier local ou d'une URL HTTP :

  • Identifiants basés sur un fichier : les jetons sont chargés à partir d'un fichier. Un autre processus doit actualiser ce fichier avec une nouvelle assertion SAML avant l'expiration de l'ancienne assertion. Par exemple, si l'assertion a une durée de vie d'une heure, vous devez actualiser le fichier avant qu'il soit obsolète.
  • Identifiants basés sur une URL : les assertions sont chargées à partir d'un serveur local avec un point de terminaison qui répond aux requêtes HTTP GET. La réponse doit être une assertion SAML ou un fichier JSON en contenant une.

Suivez ces étapes pour permettre aux bibliothèques clientes ou à Terraform d'utiliser la fédération d'identité de charge de travail pour l'authentification :

  1. Créez un fichier de configuration des identifiants à l'aide de Cloud Console ou de l'outil gcloud :

    Console

    Téléchargez un fichier de configuration des identifiants dans Cloud Console :

    1. Dans Cloud Console, accédez à la page Pools d'identités de charge de travail.

      Accéder aux pools d'identité de charge de travail

    2. Recherchez le pool d'identités de charge de travail contenant le fournisseur d'identité que vous souhaitez utiliser, puis cliquez sur Modifier.

    3. Sélectionnez Comptes de service connectés.

    4. Recherchez le compte de service que vous souhaitez utiliser, puis cliquez sur Télécharger.

    5. Dans la boîte de dialogue Configurer votre application, sélectionnez le fournisseur qui contient les identités externes qui emprunteront l'identité du compte de service.

    6. Spécifiez les paramètres supplémentaires suivants :

      AWS

      Aucun paramètre supplémentaire n'est requis.

      Azure

      Chemin d'accès à la ressource : URI d'ID application de l'application Azure

      OIDC

      Chemin d'accès au jeton OIDC : chemin d'accès au fichier local ou URL à partir de laquelle obtenir les identifiants.

      Type de format : format du fichier ou de la réponse d'URL à partir duquel le jeton d'ID est récupéré.

      Nom du champ de jeton d'objet : champ de la réponse contenant le jeton (si le type de format est json).

      SAML

      Chemin d'accès à l'assertion SAML : chemin d'accès au fichier local ou URL à partir de laquelle obtenir les identifiants.

      Type de format : format du fichier ou de la réponse d'URL à partir duquel l'assertion est récupérée.

      Nom du champ d'assertion : champ de la réponse contenant l'assertion (si le type de format est json).

    7. Sélectionnez Télécharger la configuration pour télécharger le fichier de configuration des identifiants, puis cliquez sur Fermer.

    gcloud

    Créez un fichier de configuration des identifiants à l'aide de gcloud iam workload-identity-pools create-cred-config :

    AWS

    Créez un fichier de configuration des identifiants autorisant la bibliothèque à obtenir un jeton d'accès à partir des métadonnées d'instance EC2 :

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --aws \
        --output-file=FILEPATH.json
    

    Remplacez les valeurs suivantes :

    • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail
    • POOL_ID : ID du pool d'identités de charge de travail
    • PROVIDER_ID : ID du fournisseur du pool d'identités de charge de travail
    • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service
    • FILEPATH : fichier dans lequel enregistrer la configuration

    Azure

    Créez un fichier de configuration des identifiants autorisant la bibliothèque à obtenir un jeton d'accès à partir du service de métadonnées d'instance Azure (IMDS) :

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --azure \
        --app-id-uri APPLICATION_ID_URI \
        --output-file=FILEPATH.json
    

    Remplacez les valeurs suivantes :

    • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail
    • POOL_ID : ID du pool d'identités de charge de travail
    • PROVIDER_ID : ID du fournisseur du pool d'identités de charge de travail
    • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service
    • APPLICATION_ID_URI : URI d'ID application de l'application Azure
    • FILEPATH : fichier dans lequel enregistrer la configuration

    OIDC

    Pour utiliser les identifiants provenant d'un fichier, utilisez l'option --credential-source-file :

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --output-file=FILEPATH.json \
        --credential-source-file=TOKEN_FILEPATH \
        --credential-source-type=SOURCE_TYPE \
        --credential-source-field-name=FIELD_NAME
    

    Remplacez les valeurs suivantes :

    • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail
    • POOL_ID : ID du pool d'identités de charge de travail
    • PROVIDER_ID : ID du fournisseur du pool d'identités de charge de travail
    • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service
    • FILEPATH : fichier dans lequel enregistrer la configuration
    • TOKEN_FILEPATH : chemin d'accès à l'emplacement où sont stockés les jetons d'ID OIDC
    • SOURCE_TYPE : format du fichier de jeton d'ID OIDC, défini sur text (par défaut) ou json
    • FIELD_NAME : champ dans le fichier texte contenant le jeton (si SOURCE_TYPE est json)

    Pour utiliser des identifiants provenant d'une URL, utilisez l'option --credential-source-url :

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --output-file=FILEPATH.json \
        --credential-source-url="TOKEN_URL" \
        --credential-source-headers="KEY_1=VALUE_1,KEY_2=VALUE_2" \
        --credential-source-type=source_type \
        --credential-source-field-name=field_name
    

    Remplacez les valeurs suivantes :

    • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail
    • POOL_ID : ID du pool d'identités de charge de travail
    • PROVIDER_ID : ID du fournisseur du pool d'identités de charge de travail
    • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service
    • FILEPATH : fichier dans lequel enregistrer la configuration
    • TOKEN_URL : URL à partir de laquelle récupérer le jeton d'ID OIDC
    • KEY_n, VALUE_n : en-têtes personnalisés à inclure dans la requête HTTP vers TOKEN_URL
    • SOURCE_TYPE : format du fichier de jeton d'ID OIDC, défini sur text (par défaut) ou json
    • FIELD_NAME : champ dans le fichier texte contenant le jeton (si SOURCE_TYPE est json)

    SAML

    Pour utiliser les identifiants provenant d'un fichier, utilisez l'option --credential-source-file :

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --output-file=FILEPATH.json \
        --credential-source-file=TOKEN_FILEPATH \
        --credential-source-type=SOURCE_TYPE \
        --credential-source-field-name=FIELD_NAME \
        --subject-token-type=urn:ietf:params:oauth:token-type:saml2
    

    Remplacez les valeurs suivantes :

    • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail
    • POOL_ID : ID du pool d'identités de charge de travail
    • PROVIDER_ID : ID du fournisseur du pool d'identités de charge de travail
    • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service
    • FILEPATH : fichier dans lequel enregistrer la configuration
    • TOKEN_FILEPATH : chemin d'accès à l'emplacement où sont stockées les assertions SAML
    • SOURCE_TYPE : format du fichier d'assertion SAML, défini sur text (par défaut) ou json
    • FIELD_NAME : champ dans le fichier texte contenant l'assertion (si SOURCE_TYPE est json)

    Pour utiliser des identifiants provenant d'une URL, utilisez l'option --credential-source-url :

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL \
        --output-file=FILEPATH.json \
        --credential-source-url="TOKEN_URL" \
        --credential-source-headers="KEY_1=VALUE_1,KEY_2=VALUE_2" \
        --credential-source-type=source_type \
        --credential-source-field-name=field_name \
        --subject-token-type=urn:ietf:params:oauth:token-type:saml2
    

    Remplacez les valeurs suivantes :

    • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail
    • POOL_ID : ID du pool d'identités de charge de travail
    • PROVIDER_ID : ID du fournisseur du pool d'identités de charge de travail
    • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service
    • FILEPATH : fichier dans lequel enregistrer la configuration
    • TOKEN_URL : URL à partir de laquelle récupérer l'assertion SAML
    • KEY_n, VALUE_n : en-têtes personnalisés à inclure dans la requête HTTP vers TOKEN_URL
    • SOURCE_TYPE : format du fichier d'assertion SAML, défini sur text (par défaut) ou json
    • FIELD_NAME : champ dans le fichier texte contenant l'assertion (si SOURCE_TYPE est json)
  2. Initialisez une variable d'environnement GOOGLE_APPLICATION_CREDENTIALS et pointez-la vers le fichier de configuration des identifiants :

    Bash

    export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
    

    PowerShell

    $env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
    

    FILEPATH est le chemin d'accès absolu au fichier de configuration des identifiants.

  3. Utilisez une bibliothèque cliente compatible avec la fédération d'identité de charge de travail et capable de trouver automatiquement les identifiants :

    C++

    La plupart des bibliothèques clientes Google Cloud pour C++ sont compatibles avec la fédération d'identité à l'aide d'un objet ChannelCredentials, créé en appelant grpc::GoogleDefaultCredentials(). Pour initialiser cet identifiant, vous devez créer les bibliothèques clientes avec la version 1.36.0 ou ultérieure de gRPC.

    La bibliothèque cliente Cloud Storage pour C++ utilise l'API REST et non gRPC. Elle n'est donc pas compatible avec la fédération d'identités.

    Go

    Les bibliothèques clientes pour Go sont compatibles avec la fédération d'identité si elles utilisent la version 0.0.0-20210218202405-ba52d332ba99 ou une version ultérieure du module golang.org/x/oauth2.

    Pour vérifier quelle version de ce module est utilisée par votre bibliothèque cliente, exécutez les commandes suivantes :

    cd $GOPATH/src/cloud.google.com/go
    go list -m golang.org/x/oauth2
    

    Java

    Les bibliothèques clientes pour Java sont compatibles avec la fédération d'identité si elles utilisent la version 0.24.0 ou une version ultérieure de l'artefact com.google.auth:google-auth-library-oauth2-http.

    Pour vérifier la version de cet artefact utilisée par votre bibliothèque cliente, exécutez la commande Maven suivante dans le répertoire de votre application :

    mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
    

    Node.js

    Les bibliothèques clientes pour Node.js sont compatibles avec la fédération d'identité si elles utilisent la version 7.0.2 ou ultérieure du package google-auth-library.

    Pour vérifier la version de ce package utilisée par votre bibliothèque cliente, exécutez la commande suivante dans le répertoire de votre application :

    npm list google-auth-library
    

    Lorsque vous créez un objet GoogleAuth, vous pouvez spécifier un ID de projet ou autoriser GoogleAuth à le trouver automatiquement. Pour trouver automatiquement l'ID du projet, le compte de service dans le fichier de configuration doit disposer du rôle de visiteur (roles/browser) ou d'un rôle avec des autorisations équivalentes sur votre projet. Pour en savoir plus, consultez la section README du package google-auth-library.

    Python

    Les bibliothèques clientes pour Python sont compatibles avec la fédération d'identité si elles utilisent la version 1.27.0 ou ultérieure du package google-auth.

    Pour vérifier la version de ce package utilisée par votre bibliothèque cliente, exécutez la commande suivante dans l'environnement dans lequel le package est installé :

    pip show google-auth
    

    Pour spécifier un ID de projet pour le client d'authentification, vous pouvez définir la variable d'environnement GOOGLE_CLOUD_PROJECT ou autoriser le client à trouver automatiquement l'ID du projet. Pour trouver automatiquement l'ID du projet, le compte de service dans le fichier de configuration doit disposer du rôle de visiteur (roles/browser) ou d'un rôle avec des autorisations équivalentes sur votre projet. Pour en savoir plus, consultez le guide de l'utilisateur du package google-auth.

    Terraform

    Le fournisseur Google Cloud est compatible avec la fédération d'identité de charge de travail si vous utilisez la version 3.61.0 ou ultérieure :

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = "~> 3.61.0"
        }
      }
    }
    

S'authentifier à l'aide de l'API REST

Si vous ne pouvez pas utiliser les bibliothèques clientes, vous pouvez suivre les étapes ci-dessous pour permettre à une identité externe d'obtenir un jeton d'accès éphémère à l'aide de l'API REST :

  1. Obtenez des identifiants auprès de votre fournisseur d'identité externe :

    AWS

    Créez un document JSON contenant les informations que vous devez normalement inclure dans une requête adressée au point de terminaison GetCallerIdentity() AWS, y compris une signature de requête valide.

    La fédération d'identité de charge de travail fait référence à ce document JSON sous la forme d'un jeton GetCallerIdentity. Le jeton permet à la fédération d'identité de charge de travail de valider l'identité sans révéler la clé d'accès secrète AWS.

    Un jeton GetCallerIdentity ressemble à ce qui suit :

    {
      "url": "https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
      "method": "POST",
      "headers": [
        {
          "key": "Authorization",
          "value" : "AWS4-HMAC-SHA256 Credential=AKIASOZTBDV4D7ABCDEDF/20200228/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date,Signature=abcedefdfedfd"
        },
        {
          "key": "host",
          "value": "sts.amazonaws.com"
        },
        {
          "key": "x-amz-date",
          "value": "20200228T225005Z"
        },
        {
          "key": "x-goog-cloud-target-resource",
          "value": "//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/my-pool/providers/my-aws-provider"
        },
        {
          "key": "x-amz-security-token",
          "value": "GizFWJTqYX...xJ55YoJ8E9HNU="
        }
      ]
    }
    

    Le jeton contient les champs suivants :

    • url : URL du point de terminaison AWS STS pour GetCallerIdentity(), avec le corps d'une requête GetCallerIdentity() standard ajoutée en tant que paramètres de requête. Par exemple, https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15. Les points de terminaison régionaux sont également acceptés.
    • method : méthode de requête HTTP : POST.
    • headers : en-têtes de requête HTTP, qui doivent inclure les éléments suivants :
      • Authorization : signature de la requête.
      • host : nom d'hôte du champ url, par exemple sts.amazonaws.com.
      • x-amz-date : heure d'envoi de la requête, formatée en tant que chaîne ISO 8601 au format de base. Cette valeur est généralement définie sur l'heure actuelle et permet d'éviter les attaques de répétitions.
      • x-goog-cloud-target-resource : nom complet de la ressource du fournisseur d'identité sans préfixe https:. Exemple :
        //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
        
      • x-amz-security-token : jeton de session Requis uniquement si vous utilisez des identifiants de sécurité temporaires.

    Initialisez les variables suivantes :

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:aws:token-type:aws4_request"
    SUBJECT_TOKEN=TOKEN
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:aws:token-type:aws4_request"
    $SubjectToken = "TOKEN"
    

    TOKEN est le jeton GetCallerIdentity encodé au format URL.

    Azure

    Connectez-vous à une VM Azure dotée d'une identité gérée assignée et obtenez un jeton d'accès auprès du service de métadonnées d'instance Azure (IMDS) :

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:jwt"
    SUBJECT_TOKEN=$(curl \
      "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \
      -H "Metadata: true" | jq -r .access_token)
    echo $SUBJECT_TOKEN
    

    Cette commande utilise l'outil jq. jq est disponible par défaut dans Cloud Shell.

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
      -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" `
      -Headers @{Metadata="true"}).access_token
    Write-Host $SubjectToken
    

    APP_ID_URI est l'URI d'ID application de l'application que vous avez configurée pour la fédération d'identité de charge de travail.

    OIDC

    Obtenez un jeton auprès de votre fournisseur d'identité externe et initialisez une variable :

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:jwt"
    SUBJECT_TOKEN=TOKEN
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = "TOKEN"
    

    TOKEN est le jeton émis par votre fournisseur d'identité externe.

    SAML

    Obtenez une assertion auprès de votre fournisseur d'identité externe et initialisez une variable :

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:saml2"
    SUBJECT_TOKEN=ASSERTION
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:saml2"
    $SubjectToken = "ASSERTION"
    

    ASSERTION est l'assertion encodée en base64url émise par votre fournisseur d'identité externe.

  2. Utilisez l'API Security Token Service pour échanger l'identifiant contre un jeton d'accès éphémère :

    Bash

    STS_TOKEN=$(curl -0 -X POST https://sts.googleapis.com/v1/token \
        -H 'Content-Type: text/json; charset=utf-8' \
        -d @- <<EOF | jq -r .access_token
        {
            "audience"           : "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID",
            "grantType"          : "urn:ietf:params:oauth:grant-type:token-exchange",
            "requestedTokenType" : "urn:ietf:params:oauth:token-type:access_token",
            "scope"              : "https://www.googleapis.com/auth/cloud-platform",
            "subjectTokenType"   : "$SUBJECT_TOKEN_TYPE",
            "subjectToken"       : "$SUBJECT_TOKEN"
        }
    EOF)
    echo $STS_TOKEN
    

    PowerShell

    $StsToken = (Invoke-RestMethod `
        -Method POST `
        -Uri "https://sts.googleapis.com/v1/token" `
        -ContentType "application/json" `
        -Body (@{
            "audience"           = "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID"
            "grantType"          = "urn:ietf:params:oauth:grant-type:token-exchange"
            "requestedTokenType" = "urn:ietf:params:oauth:token-type:access_token"
            "scope"              = "https://www.googleapis.com/auth/cloud-platform"
            "subjectTokenType"   = $SubjectTokenType
            "subjectToken"       = $SubjectToken
        } | ConvertTo-Json)).access_token
    Write-Host $StsToken
    

    Remplacez les valeurs suivantes :

    • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail
    • POOL_ID : ID du pool d'identités de charge de travail
    • PROVIDER_ID : ID du fournisseur du pool d'identités de charge de travail
  3. Utilisez le jeton du service de jetons de sécurité pour appeler la méthode generateAccessToken de l'API Service Account Credentials IAM afin d'obtenir un jeton d'accès :

    Bash

    ACCESS_TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken \
        -H "Content-Type: text/json; charset=utf-8" \
        -H "Authorization: Bearer $STS_TOKEN" \
        -d @- <<EOF | jq -r .accessToken
        {
            "scope": [ "https://www.googleapis.com/auth/cloud-platform" ]
        }
    EOF)
    echo $ACCESS_TOKEN
    

    PowerShell

    $AccessToken = (Invoke-RestMethod `
        -Method POST `
        -Uri "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken" `
        -Headers @{ "Authorization" = "Bearer $StsToken" } `
        -ContentType "application/json" `
        -Body (@{
            "scope" = , "https://www.googleapis.com/auth/cloud-platform"
        } | ConvertTo-Json)).accessToken
    Write-Host $AccessToken
    

    Remplacez SERVICE_ACCOUNT_EMAIL par l'adresse e-mail du compte de service.

Étape suivante