Obtenha um token de ID

Esta página descreve algumas formas de adquirir um token de ID do OpenID Connect (OIDC) assinado pela Google.

Precisa de um token de ID assinado pela Google para os seguintes exemplos de utilização de autenticação:

Para obter informações sobre os conteúdos e os prazos de validade dos tokens de ID, consulte o artigo Tokens de ID.

Os tokens de ID têm um serviço ou uma aplicação específicos para os quais podem ser usados, especificados pelo valor da respetiva reivindicação aud. Este documento usa o termo serviço de destino para se referir ao serviço ou à aplicação para a qual o token de ID pode ser usado para autenticação.

Quando recebe o token de ID, pode incluí-lo num cabeçalho Authorization no pedido ao serviço de destino.

Métodos para obter um token de ID

Existem várias formas de obter um token de ID. Esta página descreve os seguintes métodos:

Se precisar que um token de ID seja aceite por uma aplicação não alojada em Google Cloud, é provável que possa usar estes métodos. No entanto, deve determinar que reivindicações do token de ID a aplicação requer.

Obtenha um token de ID do servidor de metadados

Quando o seu código é executado num recurso que pode ter uma conta de serviço associada, o servidor de metadados do serviço associado pode normalmente fornecer um token de ID. O servidor de metadados gera tokens de ID para a conta de serviço anexada. Não pode obter um token de ID com base nas credenciais do utilizador a partir do servidor de metadados.

Pode obter um token de ID do servidor de metadados quando o seu código estiver em execução nos seguintes Google Cloud serviços:

Para obter um token de ID do servidor de metadados, consulte o ponto final de identidade da conta de serviço, conforme mostrado neste exemplo.

curl

Substitua AUDIENCE pelo URI do serviço de destino, por exemplo, http://www.example.com.

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

PowerShell

Substitua AUDIENCE pelo URI do serviço de destino, por exemplo, 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

Para executar este exemplo de código, tem de instalar a biblioteca cliente de autorização para 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.");
  }
}

Ir

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

Para executar este exemplo de código, tem de instalar a biblioteca Google Auth para 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

Para executar este exemplo de código, tem de instalar a biblioteca Python Google Auth.


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

Para executar este exemplo de código, tem de instalar a Google Auth Library for 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

Use um serviço de ligação para gerar um token de ID

Alguns Google Cloud serviços ajudam a ligar para outros serviços. Estes serviços de ligação podem ajudar a determinar quando a chamada é feita ou gerir um fluxo de trabalho que inclui chamar o serviço. Os seguintes serviços podem incluir automaticamente um token de ID, com o valor adequado para a reivindicação aud, quando iniciam uma chamada para um serviço que requer um token de ID:

Cloud Scheduler
O Cloud Scheduler é um programador de tarefas cron de nível empresarial totalmente gerido. Pode configurar o Cloud Scheduler para incluir um token de ID ou um token de acesso quando invoca outro serviço. Para mais informações, consulte o artigo Usar a autenticação com destinos HTTP.
Cloud Tasks
O Cloud Tasks permite-lhe gerir a execução de tarefas distribuídas. Pode configurar uma tarefa para incluir um token de ID ou um token de acesso quando chama um serviço. Para mais informações, consulte o artigo Usar tarefas de destino HTTP com tokens de autenticação.
Pub/Sub
O Pub/Sub permite a comunicação assíncrona entre serviços. Pode configurar o Pub/Sub para incluir um token de ID com uma mensagem. Para mais informações, consulte o artigo Autenticação para subscrição push.
Workflows
O Workflows é uma plataforma de orquestração totalmente gerida que executa serviços numa ordem que define: um fluxo de trabalho. Pode definir um fluxo de trabalho para incluir um token de ID ou um token de acesso quando invoca outro serviço. Para mais informações, consulte o artigo Faça pedidos autenticados a partir de um fluxo de trabalho.

Gere um token de ID usando a identidade de uma conta de serviço

A utilização da identidade de uma conta de serviço permite que um principal gere credenciais de curta duração para uma conta de serviço fidedigna. Em seguida, o principal pode usar estas credenciais para se autenticar como a conta de serviço.

Antes de um principal poder usar a identidade de uma conta de serviço, tem de ter uma função do IAM nessa conta de serviço que permita a utilização da identidade. Se a conta principal for outra conta de serviço, pode parecer mais fácil fornecer simplesmente as autorizações necessárias diretamente a essa conta de serviço e permitir que se faça passar por si própria. Esta configuração, conhecida como representação automática, cria uma vulnerabilidade de segurança, porque permite que a conta de serviço crie um token de acesso que pode ser atualizado indefinidamente.

A representação da identidade de uma conta de serviço deve envolver sempre dois principais: um principal que representa o autor da chamada e a conta de serviço cuja identidade está a ser representada, denominada conta de serviço com privilégios.

Para gerar um token de ID usando a identidade de uma conta de serviço, use o seguinte processo geral.

Para instruções passo a passo, consulte o artigo Crie um token de ID.

  1. Identifique ou crie uma conta de serviço para ser a conta de serviço com privilégios.

  2. Identifique as funções necessárias para invocar o serviço de destino. Conceda estas funções à conta de serviço no serviço de destino:

    • Para serviços do Cloud Run, conceda a função Cloud Run Invoker (roles/run.invoker).
    • Para funções do Cloud Run, conceda a função de invocador do Cloud Functions (roles/cloudfunctions.invoker).
    • Para outros serviços de destino, consulte a documentação do produto para o serviço.
  3. Identifique o principal que vai realizar a representação e configure as Credenciais padrão da aplicação (ADC) para usar as credenciais deste principal.

    Para ambientes de desenvolvimento, o principal é normalmente a conta de utilizador que forneceu ao ADC através da CLI gcloud. No entanto, se estiver a usar um recurso com uma conta de serviço anexada, a conta de serviço anexada é a principal.

  4. Conceda ao principal a função de criador de tokens de identidade do OpenID Connect da conta de serviço (roles/iam.serviceAccountOpenIdTokenCreator).

  5. Use a API IAM Credentials para gerar o token de ID para a conta de serviço autorizada.

    Substitua o seguinte:

    • AUDIENCE: o URI do serviço de destino, por exemplo, http://www.example.com.
    • SERVICE_ACCOUNT_EMAIL: o endereço de email da conta de serviço com privilégios.
    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{"audience": "AUDIENCE", "includeEmail": "true"}' \
    https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateIdToken
    

Gere um token de ID genérico para desenvolvimento com o Cloud Run e as funções do Cloud Run

Pode usar a CLI gcloud para obter um token de ID para as suas credenciais de utilizador que pode usar com qualquer serviço do Cloud Run ou função do Cloud Run que o autor da chamada tenha as autorizações do IAM necessárias para invocar. Este token não funciona para nenhuma outra aplicação.

O que se segue?