Ottenere un token ID

Questa pagina descrive alcuni modi per acquisire un token ID OpenID Connect (OIDC) firmato da Google.

Per i seguenti casi d'uso di autenticazione, è necessario un token ID firmato da Google:

Per informazioni sui contenuti e sulle durate dei token ID, consulta Token ID.

I token di identità hanno un servizio o un'applicazione specifici per i quali possono essere utilizzati, specificati dal valore della loro rivendicazione aud. In questa pagina viene utilizzato il termine servizio di destinazione per fare riferimento al servizio o all'applicazione con cui è possibile autenticarsi utilizzando il token ID.

Quando ricevi l'ID token, puoi includerlo in un'Authorization intestazione nella richiesta al servizio di destinazione.

Metodi per ottenere un token di identità

Esistono diversi modi per ottenere un token ID. Questa pagina descrive i seguenti metodi:

Se hai bisogno che un token di abilitazione venga accettato da un'applicazione non ospitata su Google Cloud, probabilmente puoi utilizzare questi metodi. Tuttavia, devi determinare quali rivendicazioni del token ID sono richieste dall'applicazione.

Ottieni un token ID dal server dei metadati

Quando il codice viene eseguito su una risorsa a cui può essere associato un account di servizio, il server dei metadati per il servizio associato in genere può fornire un token ID. Il server dei metadati genera token di identità per l'account di servizio associato. Non puoi ottenere un token ID in base alle credenziali utente dal server di metadati.

Puoi ottenere un token ID dal server di metadati quando il codice è in esecuzione su uno dei seguenti servizi Google Cloud:

Per recuperare un token ID dal server dei metadati, esegui una query sull'endpoint di identità per l'account di servizio, come mostrato in questo esempio.

curl

Sostituisci AUDIENCE con l'URI del servizio di destinazione, ad esempio http://www.example.com.

curl -H "Metadata-Flavor: Google" \
  'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE'

PowerShell

Sostituisci AUDIENCE con l'URI del servizio di destinazione, ad esempio http://www.example.com.

$value = (Invoke-RestMethod `
  -Headers @{'Metadata-Flavor' = 'Google'} `
  -Uri "http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE")
$value

Java

Per eseguire questo esempio di codice, devi installare la libreria client Auth per Java.


import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.IdTokenCredentials;
import com.google.auth.oauth2.IdTokenProvider;
import com.google.auth.oauth2.IdTokenProvider.Option;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Arrays;

public class IdTokenFromMetadataServer {

  public static void main(String[] args) throws IOException, GeneralSecurityException {
    // TODO(Developer): Replace the below variables before running the code.

    // The url or target audience to obtain the ID token for.
    String url = "https://example.com";

    getIdTokenFromMetadataServer(url);
  }

  // Use the Google Cloud metadata server to create an identity token and add it to the
  // HTTP request as part of an Authorization header.
  public static void getIdTokenFromMetadataServer(String url) throws IOException {
    // Construct the GoogleCredentials object which obtains the default configuration from your
    // working environment.
    GoogleCredentials googleCredentials = GoogleCredentials.getApplicationDefault();

    IdTokenCredentials idTokenCredentials =
        IdTokenCredentials.newBuilder()
            .setIdTokenProvider((IdTokenProvider) googleCredentials)
            .setTargetAudience(url)
            // Setting the ID token options.
            .setOptions(Arrays.asList(Option.FORMAT_FULL, Option.LICENSES_TRUE))
            .build();

    // Get the ID token.
    // Once you've obtained the ID token, you can use it to make an authenticated call to the
    // target audience.
    String idToken = idTokenCredentials.refreshAccessToken().getTokenValue();
    System.out.println("Generated ID token.");
  }
}

Vai

import (
	"context"
	"fmt"
	"io"

	"golang.org/x/oauth2/google"
	"google.golang.org/api/idtoken"
	"google.golang.org/api/option"
)

// getIdTokenFromMetadataServer uses the Google Cloud metadata server environment
// to create an identity token and add it to the HTTP request as part of an Authorization header.
func getIdTokenFromMetadataServer(w io.Writer, url string) error {
	// url := "http://www.example.com"

	ctx := context.Background()

	// Construct the GoogleCredentials object which obtains the default configuration from your
	// working environment.
	credentials, err := google.FindDefaultCredentials(ctx)
	if err != nil {
		return fmt.Errorf("failed to generate default credentials: %w", err)
	}

	ts, err := idtoken.NewTokenSource(ctx, url, option.WithCredentials(credentials))
	if err != nil {
		return fmt.Errorf("failed to create NewTokenSource: %w", err)
	}

	// Get the ID token.
	// Once you've obtained the ID token, you can use it to make an authenticated call
	// to the target audience.
	_, err = ts.Token()
	if err != nil {
		return fmt.Errorf("failed to receive token: %w", err)
	}
	fmt.Fprintf(w, "Generated ID token.\n")

	return nil
}

Node.js

Per eseguire questo esempio di codice, devi installare la libreria di autenticazione di Google per Node.js

/**
 * TODO(developer):
 *  1. Uncomment and replace these variables before running the sample.
 */
// const targetAudience = 'http://www.example.com';

const {GoogleAuth} = require('google-auth-library');

async function getIdTokenFromMetadataServer() {
  const googleAuth = new GoogleAuth();

  const client = await googleAuth.getIdTokenClient(targetAudience);

  // Get the ID token.
  // Once you've obtained the ID token, you can use it to make an authenticated call
  // to the target audience.
  await client.idTokenProvider.fetchIdToken(targetAudience);
  console.log('Generated ID token.');
}

getIdTokenFromMetadataServer();

Python

Per eseguire questo esempio di codice, devi installare la libreria Python di autenticazione Google.


import google
import google.oauth2.credentials
from google.auth import compute_engine
import google.auth.transport.requests


def idtoken_from_metadata_server(url: str):
    """
    Use the Google Cloud metadata server in the Cloud Run (or AppEngine or Kubernetes etc.,)
    environment to create an identity token and add it to the HTTP request as part of an
    Authorization header.

    Args:
        url: The url or target audience to obtain the ID token for.
            Examples: http://www.example.com
    """

    request = google.auth.transport.requests.Request()
    # Set the target audience.
    # Setting "use_metadata_identity_endpoint" to "True" will make the request use the default application
    # credentials. Optionally, you can also specify a specific service account to use by mentioning
    # the service_account_email.
    credentials = compute_engine.IDTokenCredentials(
        request=request, target_audience=url, use_metadata_identity_endpoint=True
    )

    # Get the ID token.
    # Once you've obtained the ID token, use it to make an authenticated call
    # to the target audience.
    credentials.refresh(request)
    # print(credentials.token)
    print("Generated ID token.")

Ruby

Per eseguire questo esempio di codice, devi installare la libreria di autenticazione Google per Ruby.

require "googleauth"

##
# Uses the Google Cloud metadata server environment to create an identity token
# and add it to the HTTP request as part of an Authorization header.
#
# @param url [String] The url or target audience to obtain the ID token for
#   (e.g. "http://www.example.com")
#
def auth_cloud_idtoken_metadata_server url:
  # Create the GCECredentials client.
  id_client = Google::Auth::GCECredentials.new target_audience: url

  # Get the ID token.
  # Once you've obtained the ID token, you can use it to make an authenticated call
  # to the target audience.
  id_client.fetch_access_token
  puts "Generated ID token."

  id_client.refresh!
end

Utilizzare un servizio di collegamento per generare un token ID

Alcuni servizi Google Cloud ti aiutano a chiamare altri servizi. Questi servizi di collegamento possono essere utili per determinare quando viene effettuata la chiamata o per gestire un flusso di lavoro che include la chiamata al servizio. I seguenti servizi possono includere automaticamente un token ID, con il valore appropriato per l'affermazione aud, quando avviano una chiamata a un servizio che richiede un token ID:

Cloud Scheduler
Cloud Scheduler è un servizio di livello enterprise completamente gestito per la pianificazione di cron job. Puoi configurare Cloud Scheduler in modo che includa un token ID o un token di accesso quando richiama un altro servizio. Per ulteriori informazioni, consulta Utilizzare l'autenticazione con i target HTTP.
Cloud Tasks
Cloud Tasks ti consente di gestire l'esecuzione di attività distribuite. Puoi configurare un'attività in modo che includa un token ID o un token di accesso quando chiama un servizio. Per saperne di più, consulta Utilizzare le attività Target HTTP con token di autenticazione.
Pub/Sub
Pub/Sub consente la comunicazione asincrona tra i servizi. Puoi configurare Pub/Sub in modo da includere un token ID con un messaggio. Per ulteriori informazioni, consulta la sezione Autenticazione per l'iscrizione push.
Workflows
Workflows è una piattaforma di orchestrazione completamente gestita che esegue i servizi in un ordine definito da te: un flusso di lavoro. Puoi definire un flusso di lavoro per includere un token ID o un token di accesso quando invoca un altro servizio. Per maggiori informazioni, consulta Inviare richieste autenticate da un flusso di lavoro.

Generare un token di identità rubando l'identità di un account di servizio

L'impersonificazione degli account di servizio consente a un'entità di generare credenziali di breve durata per un account di servizio attendibile. Il principale può quindi utilizzare queste credenziali per autenticarsi come account di servizio.

Prima che un'entità possa rubare l'identità di un account di servizio, deve disporre di un ruolo IAM su quell'account di servizio che consenta la simulazione. Se l'entità è un altro account di servizio, potrebbe sembrare più semplice fornire semplicemente le autorizzazioni richieste direttamente a quell'account di servizio e consentirgli di simulare la propria identità. Questa configurazione, nota come rappresentazione di sé, crea una vulnerabilità di sicurezza, perché consente al account di servizio di creare un token di accesso che può essere aggiornato in modo permanente.

La simulazione dell'identità degli account di servizio deve sempre coinvolgere due entità: un'entità che rappresenta l'utente chiamante e l'account di servizio di cui viene simulata l'identità, chiamato account di servizio con privilegi.

Per generare un token di identità rubando l'identità di un account di servizio, utilizza la seguente procedura generale.

Per istruzioni dettagliate, consulta Creare un token ID.

  1. Identifica o crea un account di servizio che abbia i privilegi.

  2. Identifica i ruoli richiesti per richiamare il servizio target. Concedi questi ruoli all'account di servizio nel servizio di destinazione:

    • Per i servizi Cloud Run, concedi il ruolo Cloud Run Invoker (roles/run.invoker).
    • Per Cloud Run Functions, concedi il ruolo Cloud Functions Invoker (roles/cloudfunctions.invoker).
    • Per altri servizi di destinazione, consulta la documentazione del prodotto per il servizio.
  3. Identifica il principale che eseguirà la rappresentazione e configura le credenziali predefinite dell'applicazione per utilizzare le credenziali di questo principale.

    Per gli ambienti di sviluppo, l'entità principale è in genere l'account utente fornito ad ADC utilizzando l'interfaccia alla gcloud CLI. Tuttavia, se stai eseguendo il servizio su una risorsa con un account di servizio collegato, l'account di servizio collegato è l'entità.

  4. Concedi al principale il ruolo Creatore token di identità OpenID Connect dell'account di servizio (roles/iam.serviceAccountOpenIdTokenCreator).

  5. Utilizza l'API Credentials IAM per generare il token ID per l'account di servizio autorizzato.

Generare un token ID generico per lo sviluppo con Cloud Run e le funzioni Cloud Run

Puoi utilizzare l'interfaccia alla gcloud CLI per ottenere un token ID per le tue credenziali utente che può essere utilizzato con qualsiasi servizio Cloud Run o funzione Cloud Run per cui l'utente chiamante dispone delle autorizzazioni IAM richieste per invocare. Questo token non funzionerà per nessun'altra applicazione.

Passaggi successivi