Criar credenciais de curta duração para uma conta de serviço

Nesta página, explicamos como criar credenciais de curta duração para uma conta de serviço, que podem ser usadas para representar a conta de serviço. Dependendo do tipo de token criado, o token de curta duração fornece a identidade (para tokens de ID) ou permissões (para tokens de acesso) associada à conta de serviço.

Se a arquitetura do sistema exigir que você use uma série de chamadas de geração de tokens, use uma cadeia de delegação com várias contas de serviço. Na maioria dos casos, o método direto, conforme explicado nesta página, é suficiente.

Antes de começar

  • Enable the IAM and Service Account Credentials APIs:

    gcloud services enable iam.googleapis.com iamcredentials.googleapis.com
  • Configure a autenticação.

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    Go

    Para usar os exemplos Go desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local na documentação de autenticação do Google Cloud.

    Java

    Para usar os exemplos Java desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local na documentação de autenticação do Google Cloud.

    Node.js

    Para usar os exemplos Node.js desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local na documentação de autenticação do Google Cloud.

    Python

    Para usar os exemplos Python desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local na documentação de autenticação do Google Cloud.

    REST

    Para usar as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para gcloud CLI.

      Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init

    Para mais informações, consulte Autenticar para usar REST na documentação de autenticação do Google Cloud.

  • Entenda as contas de serviço do IAM.

  • Entenda a representação de uma conta de serviço.

  • Entenda que tipo de token é necessário e siga as etapas apropriadas nas seções abaixo:

Criar um token de acesso de curta duração

Os tokens de acesso são aceitos para autenticação pela maioria das APIs do Google. Quando você gera um token de acesso usando a representação da conta de serviço, ele não vem com um token de atualização. Isso significa que, quando o token expirar, você precisará repetir o processo de representação para gerar um novo.

Para mais informações, consulte Tokens de acesso.

Para criar um token de acesso de curta duração, conclua estas tarefas:

Fornecer as permissões necessárias

Uma solicitação direta envolve duas identidades: o autor da chamada que solicita a credencial e a conta de serviço para a qual a credencial é criada. A configuração das permissões depende se o autor da chamada está se autenticando como uma conta de serviço ou como uma conta de usuário.

Se você quiser executar um comando REST ou a CLI gcloud nesta página em um ambiente de desenvolvimento local, o autor da chamada poderá ser representado por credenciais de usuário. Para cargas de trabalho automatizadas, como um aplicativo em execução no Compute Engine, o autor da chamada precisa ser representado por uma conta de serviço.

Conta de serviço

Quando o aplicativo de chamada usa uma conta de serviço como identidade, os principais a seguir estão envolvidos:

  • Conta de serviço de chamadas (CALLER_SA)

    Essa conta de serviço representa o aplicativo de chamada, que emite a solicitação para as credenciais de curta duração.

  • Conta de serviço com privilégios (PRIV_SA)

    Essa conta de serviço recebe os papéis do IAM necessários para o token de curta duração. Essa é a conta de serviço para a qual o token de curta duração é criado.

Para fornecer permissões CALLER_SA para criar credenciais de curta duração para PRIV_SA, você concede CALLER_SA o papel "Criador de token de conta de serviço" (roles/iam.serviceAccountTokenCreator) emPRIV_SA.

Conceda o papel necessário em PRIV_SA:

Console

  1. No Console do Google Cloud, acesse a página Contas de serviço.

    Acessar Contas de serviço

  2. Selecione um projeto.
  3. Clique no endereço de e-mail da conta de serviço com privilégios, PRIV_SA.
  4. Clique na guia Permissões..
  5. Em Principais com acesso a esta conta de serviço, clique em Conceder acesso.
  6. Insira o endereço de e-mail da conta de serviço do autor da chamada, CALLER_SA.

    Por exemplo, demo@my-project.iam.gserviceaccount.com.

  7. Selecione o papel Criador do token da conta de serviço (roles/iam.serviceAccountTokenCreator).
  8. Clique em Salvar para conceder o papel à conta de serviço.

gcloud

O comando gcloud iam service-accounts add-iam-policy-binding concede um papel em uma conta de serviço.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token é gerado.
  • CALLER_SA: o endereço de e-mail da conta de serviço que representa o aplicativo que está solicitando o token de curta duração.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Você receberá uma resposta semelhante a esta:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. Leia a política de permissão para PRIV_SA:

    O método serviceAccounts.getIamPolicy recebe a política do IAM de uma conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    Corpo JSON da solicitação:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    Se você não tiver concedido aos papéis à conta de serviço, a resposta conterá apenas um valor etag. Inclua esse valor etag na próxima etapa.

  2. Modifique a política de autorização para atribuir a CALLER_SA o papel "Criador de token da conta de serviço" (roles/iam.serviceAccountTokenCreator).

    Por exemplo, para modificar a resposta de amostra da etapa anterior, adicione o seguinte:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. Grave a política de permissão atualizada:

    O método serviceAccounts.setIamPolicy define uma política de permissão atualizada para a conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.
    • POLICY: uma representação JSON da política que você quer definir. Para mais informações sobre o formato de uma política, consulte a referência da política.

      Por exemplo, para definir a política de permissão mostrada na etapa anterior, substitua POLICY pela seguinte, em que CALLER_SA é a conta de serviço que cria o token de curta duração:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    Corpo JSON da solicitação:

    {
      "policy": POLICY
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    A resposta contém a política de permissão atualizada.

Credenciais do usuário

Quando você quiser usar a Google Cloud CLI para gerar tokens de curta duração ou gerar tokens de curta duração a partir de um ambiente de desenvolvimento local, é possível usar uma conta de usuário para gerar os tokens. Muitas vezes, é possível usar sua própria conta de usuário.

Quando você usa uma conta de usuário para gerar tokens de curta duração, as seguintes identidades são envolvidas:

  • Conta do autor da chamada (CALLER_ACCOUNT)

    Essa conta de usuário é usada para gerar credenciais de curta duração para a conta de serviço com privilégios.

  • Conta de serviço com privilégios (PRIV_SA)

    Essa conta de serviço recebe os papéis do IAM necessários para o token de curta duração. Essa é a conta de serviço para a qual o token de curta duração é criado.

Para permitir que CALLER_ACCOUNT crie credenciais de curta duração para PRIV_SA, conceda a CALLER_ACCOUNT o papel de criador de token da conta de serviço (roles/iam.serviceAccountTokenCreator) em PRIV_SA.

Conceda o papel necessário em PRIV_SA:

Console

  1. No Console do Google Cloud, acesse a página Contas de serviço.

    Acessar Contas de serviço

  2. Selecione um projeto.
  3. Clique no endereço de e-mail da conta de serviço com privilégios, PRIV_SA.
  4. Clique na guia Permissões..
  5. Em Principais com acesso a esta conta de serviço, clique em Conceder acesso.
  6. Insira o identificador principal da conta do autor da chamada, CALLER_ACCOUNT.

    Por exemplo, example-user@example.com

  7. Selecione o papel Criador do token da conta de serviço (roles/iam.serviceAccountTokenCreator).
  8. Clique em Salvar para conceder o papel à conta de usuário.

gcloud

O comando gcloud iam service-accounts add-iam-policy-binding concede um papel em uma conta de serviço.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token é gerado.
  • CALLER_ACCOUNT: o endereço de e-mail da conta de usuário que está sendo usada para solicitar o token de curta duração.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Você receberá uma resposta semelhante a esta:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. Leia a política de permissão para PRIV_SA:

    O método serviceAccounts.getIamPolicy recebe a política do IAM de uma conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    Corpo JSON da solicitação:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    Se você não tiver concedido aos papéis à conta de serviço, a resposta conterá apenas um valor etag. Inclua esse valor etag na próxima etapa.

  2. Em seguida, modifique a política de autorização para atribuir a CALLER_ACCOUNT o papel "Criador de token da conta de serviço" (roles/iam.serviceAccountTokenCreator).

    Por exemplo, para modificar a resposta de amostra da etapa anterior, adicione o seguinte:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. Grave a política de permissão atualizada:

    O método serviceAccounts.setIamPolicy define uma política de permissão atualizada para a conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.
    • POLICY: uma representação JSON da política que você quer definir. Para mais informações sobre o formato de uma política, consulte a referência da política.

      Por exemplo, para definir a política de permissão mostrada na etapa anterior, substitua POLICY pela seguinte, em que CALLER_ACCOUNT é a conta de usuário que cria o token de curta duração:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    Corpo JSON da solicitação:

    {
      "policy": POLICY
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    A resposta contém a política de permissão atualizada.

Gerar o token de acesso

É possível gerar um token de acesso OAuth 2.0 usando a CLI gcloud, a API REST ou as bibliotecas de cliente do Cloud e de APIs do Google.

Se você usa a API REST e o sistema está configurado para permitir ciclos de vida estendidos do token, é possível criar um token com vida útil maior que o padrão. A Google Cloud CLi não é compatível com a configuração de um ciclo de vida para o token.

As amostras abaixo foram projetadas para serem usadas em um ambiente de desenvolvimento local. O autor da chamada precisa ser representado por uma conta de usuário, não uma conta de serviço.

Para gerar um token de acesso do OAuth 2.0 para uma conta de serviço, faça o seguinte:

gcloud

  1. Verifique se você fez login na gcloud CLI com a conta de usuário do autor da chamada.

  2. Gere um token para a conta de serviço usando o comando gcloud auth print-access-token.

    Antes de usar os dados do comando abaixo, faça estas substituições:

    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.

    Execute o seguinte comando:

    Linux, macOS ou Cloud Shell

    gcloud auth print-access-token --impersonate-service-account=PRIV_SA

    Windows (PowerShell)

    gcloud auth print-access-token --impersonate-service-account=PRIV_SA

    Windows (cmd.exe)

    gcloud auth print-access-token --impersonate-service-account=PRIV_SA

    Você receberá uma resposta semelhante a esta:

    WARNING: This command is using service account impersonation. All API calls will be executed as
    [my-sa@my-project.iam.gserviceaccount.com].
    ya29.c.b0AXv0zTPnzTnDV8F8Aj5Fgy46Yf2v_v8eZIoKq7xGpfbpXuy23aQ1693m3gAuE8AZga7w6kdagN7a9bfdDYbdeoGY0CMHOClsCwIdutL7k_RFC672lOCbUgF5hS8Iu2nCA8hle-11LJXBLmaxFmH08ZTBJLuDrWSNd8cYqGYFunSC1K1qLIPBF18tsa0hxVgKPucI8b1A9L8_MK1JGLGcr0n7-zY77_lmbcdODG3NmIbLOGWOutjJgqSO_YoeCKK2QTUZIp5PG7RkKlXWnmYJA9pEahzNoQrs5sWZctc2bia9af_ITzqqlXC9h1Kj5-me6e8rd734MJvpagqYazRk0gGWpMb03XmMGpgPc_FBp4pnX9rGOzW83SNpcDz8zeFO1Q0Bo3N7CuZougjRce0y8I2_4rtw5ME_nV3wrCWa..................................................................................................................................................................................................................................................................................................
    

REST

O método serviceAccounts.generateAccessToken da API Service Account Credentials gera um token de acesso do OAuth 2.0 para uma conta de serviço.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
  • LIFETIME: o tempo até o token de acesso expirar, em segundos. Por exemplo, 300s.

    Por padrão, o ciclo de vida máximo do token é de uma hora (3,600 segundos). Para aumentar o ciclo de vida máximo desses tokens para 12 horas (43.200 segundos), adicione a conta de serviço a uma política da organização que inclua a restrição de lista constraints/iam.allowServiceAccountCredentialLifetimeExtension.

Método HTTP e URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:generateAccessToken

Corpo JSON da solicitação:

{
  "scope": [
    "https://www.googleapis.com/auth/cloud-platform"
  ],
  "lifetime": "LIFETIME"
}

Para enviar a solicitação, expanda uma destas opções:

Se a solicitação generateAccessToken for bem-sucedida, o corpo da resposta conterá um token de acesso do OAuth 2.0 e um prazo de validade. O accessToken poderá ser usado para autenticar uma solicitação em nome da conta de serviço até que o expireTime seja atingido.

{
  "accessToken": "eyJ0eXAi...NiJ9",
  "expireTime": "2020-04-07T15:01:23.045123456Z"
}

Go

import (
	"context"
	"fmt"
	"io"
	"time"

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

// getAccessTokenFromImpersonatedCredentials uses a service account (SA1) to impersonate
// another service account (SA2) and obtain OAuth2 token for the impersonated account.
// To obtain a token for SA2, SA1 should have the "roles/iam.serviceAccountTokenCreator" permission on SA2.
func getAccessTokenFromImpersonatedCredentials(w io.Writer, impersonatedServiceAccount, scope string) error {
	// impersonatedServiceAccount := "name@project.service.gserviceaccount.com"
	// scope := "https://www.googleapis.com/auth/cloud-platform"

	ctx := context.Background()

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

	ts, err := impersonate.CredentialsTokenSource(ctx, impersonate.CredentialsConfig{
		TargetPrincipal: impersonatedServiceAccount,
		Scopes:          []string{scope},
		Lifetime:        300 * time.Second,
		// delegates: The chained list of delegates required to grant the final accessToken.
		// For more information, see:
		// https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
		// Delegates is NOT USED here.
		Delegates: []string{},
	}, option.WithCredentials(credentials))
	if err != nil {
		fmt.Fprintf(w, "CredentialsTokenSource error: %v", err)
		return fmt.Errorf("CredentialsTokenSource error: %w", err)
	}

	// Get the OAuth2 token.
	// Once you've obtained the OAuth2 token, you can use it to make an authenticated call.
	t, err := ts.Token()
	if err != nil {
		fmt.Fprintf(w, "failed to receive token: %v", err)
		return fmt.Errorf("failed to receive token: %w", err)
	}
	fmt.Fprintf(w, "Generated OAuth2 token with length %d.\n", len(t.AccessToken))

	return nil
}

Java


package com.google.cloud.auth.samples;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.ImpersonatedCredentials;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class AccessTokenFromImpersonatedCredentials {

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

    // Provide the scopes that you might need to request access to Google APIs,
    // depending on the level of access you need.
    // This example uses the cloud-wide scope and uses IAM to narrow the permissions.
    // https://cloud.google.com/docs/authentication/external/authorization-gcp
    // For more information, see: https://developers.google.com/identity/protocols/oauth2/scopes
    String scope = "https://www.googleapis.com/auth/cloud-platform";

    // The name of the privilege-bearing service account for whom the credential is created.
    String impersonatedServiceAccount = "name@project.service.gserviceaccount.com";

    getAccessToken(impersonatedServiceAccount, scope);
  }

  // Use a service account (SA1) to impersonate another service account (SA2) and obtain an ID token
  // for the impersonated account.
  // To obtain a token for SA2, SA1 should have the "roles/iam.serviceAccountTokenCreator"
  // permission on SA2.
  public static void getAccessToken(
      String impersonatedServiceAccount, String scope) throws IOException {

    // Construct the GoogleCredentials object which obtains the default configuration from your
    // working environment.
    GoogleCredentials googleCredentials = GoogleCredentials.getApplicationDefault();

    // delegates: The chained list of delegates required to grant the final accessToken.
    // For more information, see:
    // https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
    // Delegate is NOT USED here.
    List<String> delegates = null;

    // Create the impersonated credential.
    ImpersonatedCredentials impersonatedCredentials =
        ImpersonatedCredentials.newBuilder()
            .setSourceCredentials(googleCredentials)
            .setTargetPrincipal(impersonatedServiceAccount)
            .setScopes(Arrays.asList(scope))
            .setLifetime(300)
            .setDelegates(delegates)
            .build();

    // Get the OAuth2 token.
    // Once you've obtained the OAuth2 token, you can use it to make an authenticated call.
    impersonatedCredentials.refresh();
    String accessToken = impersonatedCredentials.getAccessToken().getTokenValue();
    System.out.println("Generated access token.");
  }
}

Node.js

/**
 * TODO(developer):
 *  Uncomment and replace these variables before running the sample.
 */
// const impersonatedServiceAccount = 'name@project.service.gserviceaccount.com';
// const scope = 'https://www.googleapis.com/auth/cloud-platform';

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

async function getAccessTokenFromImpersonatedCredentials() {
  const googleAuth = new GoogleAuth({
    scopes: scope,
  });
  // Construct the GoogleCredentials object which obtains the default configuration from your
  // working environment.
  const {credential} = await googleAuth.getApplicationDefault();

  // delegates: The chained list of delegates required to grant the final accessToken.
  // For more information, see:
  // https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
  // Delegate is NOT USED here.
  const delegates = [];

  // Create the impersonated credential.
  const impersonatedCredentials = new Impersonated({
    sourceClient: credential,
    delegates,
    targetPrincipal: impersonatedServiceAccount,
    targetScopes: [scope],
    lifetime: 300,
  });

  // Get the OAuth2 token.
  // Once you've obtained the OAuth2 token, you can use it to make an authenticated call
  // to the target audience.
  const resp = await impersonatedCredentials.getAccessToken();
  // Token is in resp.token.
  console.log('Generated OAuth2 token with length %s', resp.token.length);
}

getAccessTokenFromImpersonatedCredentials();

Python

def accesstoken_from_impersonated_credentials(
    impersonated_service_account: str, scope: str
):
    from google.auth import impersonated_credentials
    import google.auth.transport.requests

    """
      Use a service account (SA1) to impersonate another service account (SA2)
      and obtain an ID token for the impersonated account.
      To obtain a token for SA2, SA1 should have the
      "roles/iam.serviceAccountTokenCreator" permission on SA2.

    Args:
        impersonated_service_account: The name of the privilege-bearing service account for whom the credential is created.
            Examples: name@project.service.gserviceaccount.com

        scope: Provide the scopes that you might need to request to access Google APIs,
            depending on the level of access you need.
            For this example, we use the cloud-wide scope and use IAM to narrow the permissions.
            https://cloud.google.com/docs/authentication#authorization_for_services
            For more information, see: https://developers.google.com/identity/protocols/oauth2/scopes
    """

    # Construct the GoogleCredentials object which obtains the default configuration from your
    # working environment.
    credentials, project_id = google.auth.default()

    # Create the impersonated credential.
    target_credentials = impersonated_credentials.Credentials(
        source_credentials=credentials,
        target_principal=impersonated_service_account,
        # delegates: The chained list of delegates required to grant the final accessToken.
        # For more information, see:
        # https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
        # Delegate is NOT USED here.
        delegates=[],
        target_scopes=[scope],
        lifetime=300,
    )

    # Get the OAuth2 token.
    # Once you've obtained the OAuth2 token, use it to make an authenticated call
    # to the target audience.
    request = google.auth.transport.requests.Request()
    target_credentials.refresh(request)
    # The token field is target_credentials.token.
    print("Generated OAuth2 token.")

Criar um token de ID do OpenID Connect (OIDC)

Os tokens de ID seguem a especificação OpenID Connect (OIDC). Os tokens de ID são aceitos por um número limitado de serviços e aplicativos.

Para mais informações, consulte Tokens de ID e Autenticação para aplicativos hospedados no Cloud Run ou Cloud Run functions.

Para criar um token de ID, conclua estas tarefas:

Fornecer as permissões necessárias

Uma solicitação direta envolve duas identidades: o autor da chamada que solicita a credencial e a conta de serviço para a qual a credencial é criada. A configuração das permissões depende se o autor da chamada está se autenticando como uma conta de serviço ou como uma conta de usuário.

Se você quiser executar um comando REST ou a CLI gcloud nesta página em um ambiente de desenvolvimento local, o autor da chamada poderá ser representado por credenciais de usuário. Para cargas de trabalho automatizadas, como um aplicativo em execução no Compute Engine, o autor da chamada precisa ser representado por uma conta de serviço.

Conta de serviço

Quando o aplicativo de chamada usa uma conta de serviço como identidade, os principais a seguir estão envolvidos:

  • Conta de serviço de chamadas (CALLER_SA)

    Essa conta de serviço representa o aplicativo de chamada, que emite a solicitação para as credenciais de curta duração.

  • Conta de serviço com privilégios (PRIV_SA)

    Essa conta de serviço recebe os papéis do IAM necessários para o token de curta duração. Essa é a conta de serviço para a qual o token de curta duração é criado.

Para conceder permissões a CALLER_SA para criar credenciais de curta duração para PRIV_SA, conceda a CALLER_SA o papel de Criador de token de identidade do OpenID Connect da conta de serviço (roles/iam.serviceAccountOpenIdTokenCreator) em PRIV_SA

Conceda o papel necessário em PRIV_SA:

Console

  1. No Console do Google Cloud, acesse a página Contas de serviço.

    Acessar Contas de serviço

  2. Selecione um projeto.
  3. Clique no endereço de e-mail da conta de serviço com privilégios, PRIV_SA.
  4. Clique na guia Permissões..
  5. Em Principais com acesso a esta conta de serviço, clique em Conceder acesso.
  6. Insira o endereço de e-mail da conta de serviço do autor da chamada, CALLER_SA.

    Por exemplo, demo@my-project.iam.gserviceaccount.com.

  7. Selecione o papel de Criador do token de identidade do OpenID Connect da conta de serviço (roles/iam.serviceAccountOpenIdTokenCreator).
  8. Clique em Salvar para conceder o papel à conta de serviço.

gcloud

O comando gcloud iam service-accounts add-iam-policy-binding concede um papel em uma conta de serviço.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token é gerado.
  • CALLER_SA: o endereço de e-mail da conta de serviço que representa o aplicativo que está solicitando o token de curta duração.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Windows (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Você receberá uma resposta semelhante a esta:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountOpenIdTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. Leia a política de permissão para PRIV_SA:

    O método serviceAccounts.getIamPolicy recebe a política do IAM de uma conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    Corpo JSON da solicitação:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    Se você não tiver concedido aos papéis à conta de serviço, a resposta conterá apenas um valor etag. Inclua esse valor etag na próxima etapa.

  2. Modifique a política de permissão para conceder a CALLER_SA o papel de Criador de token de identidade do OpenID Connect da conta de serviço (roles/iam.serviceAccountOpenIdTokenCreator).

    Por exemplo, para modificar a resposta de amostra da etapa anterior, adicione o seguinte:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountOpenIdTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. Grave a política de permissão atualizada:

    O método serviceAccounts.setIamPolicy define uma política de permissão atualizada para a conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.
    • POLICY: uma representação JSON da política que você quer definir. Para mais informações sobre o formato de uma política, consulte a referência da política.

      Por exemplo, para definir a política de permissão mostrada na etapa anterior, substitua POLICY pela seguinte, em que CALLER_SA é a conta de serviço que cria o token de curta duração:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountOpenIdTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    Corpo JSON da solicitação:

    {
      "policy": POLICY
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    A resposta contém a política de permissão atualizada.

Credenciais do usuário

Quando você quiser usar a Google Cloud CLI para gerar tokens de curta duração ou gerar tokens de curta duração a partir de um ambiente de desenvolvimento local, é possível usar uma conta de usuário para gerar os tokens. Muitas vezes, é possível usar sua própria conta de usuário.

Quando você usa uma conta de usuário para gerar tokens de curta duração, as seguintes identidades são envolvidas:

  • Conta do autor da chamada (CALLER_ACCOUNT)

    Essa conta de usuário é usada para gerar credenciais de curta duração para a conta de serviço com privilégios.

  • Conta de serviço com privilégios (PRIV_SA)

    Essa conta de serviço recebe os papéis do IAM necessários para o token de curta duração. Essa é a conta de serviço para a qual o token de curta duração é criado.

Para permitir que CALLER_ACCOUNT crie credenciais de curta duração para PRIV_SA, conceda a CALLER_ACCOUNT o papel de Criador de token de identidade do OpenID Connect da conta de serviço (roles/iam.serviceAccountOpenIdTokenCreator) em PRIV_SA.

Conceda o papel necessário em PRIV_SA:

Console

  1. No Console do Google Cloud, acesse a página Contas de serviço.

    Acessar Contas de serviço

  2. Selecione um projeto.
  3. Clique no endereço de e-mail da conta de serviço com privilégios, PRIV_SA.
  4. Clique na guia Permissões..
  5. Em Principais com acesso a esta conta de serviço, clique em Conceder acesso.
  6. Insira o identificador principal da conta do autor da chamada, CALLER_ACCOUNT.

    Por exemplo, example-user@example.com

  7. Selecione o papel de Criador do token de identidade do OpenID Connect da conta de serviço (roles/iam.serviceAccountOpenIdTokenCreator).
  8. Clique em Salvar para conceder o papel à conta de usuário.

gcloud

O comando gcloud iam service-accounts add-iam-policy-binding concede um papel em uma conta de serviço.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token é gerado.
  • CALLER_ACCOUNT: o endereço de e-mail da conta de usuário que está sendo usada para solicitar o token de curta duração.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Windows (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Você receberá uma resposta semelhante a esta:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountOpenIdTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. Leia a política de permissão para PRIV_SA:

    O método serviceAccounts.getIamPolicy recebe a política do IAM de uma conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    Corpo JSON da solicitação:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    Se você não tiver concedido aos papéis à conta de serviço, a resposta conterá apenas um valor etag. Inclua esse valor etag na próxima etapa.

  2. Modifique a política de permissão para conceder a CALLER_ACCOUNT o papel de Criador de token de identidade do OpenID Connect da conta de serviço (roles/iam.serviceAccountOpenIdTokenCreator).

    Por exemplo, para modificar a resposta de amostra da etapa anterior, adicione o seguinte:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountOpenIdTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. Grave a política de permissão atualizada:

    O método serviceAccounts.setIamPolicy define uma política de permissão atualizada para a conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.
    • POLICY: uma representação JSON da política que você quer definir. Para mais informações sobre o formato de uma política, consulte a referência da política.

      Por exemplo, para definir a política de permissão mostrada na etapa anterior, substitua POLICY pela seguinte, em que CALLER_ACCOUNT é a conta de usuário que cria o token de curta duração:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountOpenIdTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    Corpo JSON da solicitação:

    {
      "policy": POLICY
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    A resposta contém a política de permissão atualizada.

Gerar o token de ID

É possível gerar um token de ID do OpenID Connect (OIDC) usando a CLI gcloud, a API REST ou as bibliotecas de cliente do Google Cloud e da API do Google.

As amostras abaixo foram projetadas para serem usadas em um ambiente de desenvolvimento local. O autor da chamada precisa ser representado por uma conta de usuário, não uma conta de serviço.

Os tokens de ID do OIDC são válidos por 1 hora (3.600 segundos).

Gere um token de ID OIDC assinado pelo Google para uma conta de serviço:

gcloud

  1. Verifique se você fez login na gcloud CLI com a conta de usuário do autor da chamada.

  2. Gere um token para a conta de serviço usando o comando gcloud auth print-identity-token.

    Antes de usar os dados do comando abaixo, faça estas substituições:

    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • AUDIENCE_NAME: o público-alvo do token, geralmente o URL do aplicativo ou serviço que o token será usado para acessar.
      • Execute o seguinte comando:

        Linux, macOS ou Cloud Shell

        gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"

        Windows (PowerShell)

        gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"

        Windows (cmd.exe)

        gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"

        Você receberá uma resposta semelhante a esta:

        WARNING: This command is using service account impersonation. All API calls will be executed as
        [my-sa@my-project.iam.gserviceaccount.com].
        eyJhbGciOiJSUzI1NiIsImtpZDNhMDg4ZDRmZmMjJkYTVmZTM5MDZjY2MiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJ3d3cuZXhhbXBsJhenAiOiIxMTYzwNDYyMDk0ODIiLCJleHAiOjE2NTQ4ODU0MzEsImlhdCI6MTY1NDg4MTgzMSwiaXN6Ly9hY2NvdW50cy5nb29nbGUuY29tIiwic3ViIMDQ2MjA5NDgyIn0.F7mu8IHj5VQdu7ItFrnYAKyGd7YqXuOP_rFLc98q8BaFBycAF1zAQnSnwqnSUXba0UK9PDT_-IOry68qLwBObz4XlX9lk0ehpN0O0W9FcFToKLB6wefXXPd4h7xtuPe5KzmpSOqj2Qqv34HriGw00Nqd-oGSgNY_lZ4wGEf4rT4oQa_kEcrY57Q2G6pwd769BhgeFwoLi5aK_Cv2kvf_zfMszC-xlkP9zwWQ8XinJBwe-qcQBa4NTgrbueNtXsEjccBS366zmw
        

REST

O método serviceAccounts.generateIdToken da API Service Account Credentials gera um token de ID do OIDC para uma conta de serviço.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
  • AUDIENCE_NAME: o público-alvo do token, geralmente o URL do aplicativo ou serviço que o token será usado para acessar.

Método HTTP e URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:generateIdToken

Corpo JSON da solicitação:

{
  "audience": "AUDIENCE_NAME",
  "includeEmail": "true"
}

Para enviar a solicitação, expanda uma destas opções:

Se a solicitação generateId for bem-sucedida, o corpo da resposta conterá um token de ID válido por 1 hora: O token pode ser usado para autenticar uma solicitação em nome da conta de serviço:

{
  "token": "eyJ0eXAi...NiJ9"
}

Criar um JSON Web Token (JWT) autoassinado

Os JSON Web Tokens (JWTs) autoassinados são úteis em várias situações:

  • Comunicação segura entre seus próprios aplicativos. Nesse cenário, um aplicativo pode assinar um token a ser verificado por outro aplicativo para fins de autenticação.
  • Autenticar uma chamada para uma API Google, conforme descrito em Autorização de conta de serviço sem OAuth.
  • Autenticação em uma API implantada com o gateway de API.
  • Tratar uma conta de serviço como provedor de identidade assinando um JWT que contenha declarações arbitrárias sobre um usuário, uma conta ou um dispositivo.

Para criar um JWT, conclua estas tarefas:

Fornecer as permissões necessárias

Uma solicitação direta envolve duas identidades: o autor da chamada que solicita a credencial e a conta de serviço para a qual a credencial é criada. A configuração das permissões depende se o autor da chamada está se autenticando como uma conta de serviço ou como uma conta de usuário.

Se você quiser executar um comando REST ou a CLI gcloud nesta página em um ambiente de desenvolvimento local, o autor da chamada poderá ser representado por credenciais de usuário. Para cargas de trabalho automatizadas, como um aplicativo em execução no Compute Engine, o autor da chamada precisa ser representado por uma conta de serviço.

Conta de serviço

Quando o aplicativo de chamada usa uma conta de serviço como identidade, os principais a seguir estão envolvidos:

  • Conta de serviço de chamadas (CALLER_SA)

    Essa conta de serviço representa o aplicativo de chamada, que emite a solicitação para as credenciais de curta duração.

  • Conta de serviço com privilégios (PRIV_SA)

    Essa conta de serviço recebe os papéis do IAM necessários para o token de curta duração. Essa é a conta de serviço para a qual o token de curta duração é criado.

Para fornecer permissões CALLER_SA para criar credenciais de curta duração para PRIV_SA, você concede CALLER_SA o papel "Criador de token de conta de serviço" (roles/iam.serviceAccountTokenCreator) emPRIV_SA.

Conceda o papel necessário em PRIV_SA:

Console

  1. No Console do Google Cloud, acesse a página Contas de serviço.

    Acessar Contas de serviço

  2. Selecione um projeto.
  3. Clique no endereço de e-mail da conta de serviço com privilégios, PRIV_SA.
  4. Clique na guia Permissões..
  5. Em Principais com acesso a esta conta de serviço, clique em Conceder acesso.
  6. Insira o endereço de e-mail da conta de serviço do autor da chamada, CALLER_SA.

    Por exemplo, demo@my-project.iam.gserviceaccount.com.

  7. Selecione o papel Criador do token da conta de serviço (roles/iam.serviceAccountTokenCreator).
  8. Clique em Salvar para conceder o papel à conta de serviço.

gcloud

O comando gcloud iam service-accounts add-iam-policy-binding concede um papel em uma conta de serviço.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token é gerado.
  • CALLER_SA: o endereço de e-mail da conta de serviço que representa o aplicativo que está solicitando o token de curta duração.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Você receberá uma resposta semelhante a esta:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. Leia a política de permissão para PRIV_SA:

    O método serviceAccounts.getIamPolicy recebe a política do IAM de uma conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    Corpo JSON da solicitação:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    Se você não tiver concedido aos papéis à conta de serviço, a resposta conterá apenas um valor etag. Inclua esse valor etag na próxima etapa.

  2. Modifique a política de autorização para atribuir a CALLER_SA o papel "Criador de token da conta de serviço" (roles/iam.serviceAccountTokenCreator).

    Por exemplo, para modificar a resposta de amostra da etapa anterior, adicione o seguinte:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. Grave a política de permissão atualizada:

    O método serviceAccounts.setIamPolicy define uma política de permissão atualizada para a conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.
    • POLICY: uma representação JSON da política que você quer definir. Para mais informações sobre o formato de uma política, consulte a referência da política.

      Por exemplo, para definir a política de permissão mostrada na etapa anterior, substitua POLICY pela seguinte, em que CALLER_SA é a conta de serviço que cria o token de curta duração:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    Corpo JSON da solicitação:

    {
      "policy": POLICY
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    A resposta contém a política de permissão atualizada.

Credenciais do usuário

Quando você quiser usar a Google Cloud CLI para gerar tokens de curta duração ou gerar tokens de curta duração a partir de um ambiente de desenvolvimento local, é possível usar uma conta de usuário para gerar os tokens. Muitas vezes, é possível usar sua própria conta de usuário.

Quando você usa uma conta de usuário para gerar tokens de curta duração, as seguintes identidades são envolvidas:

  • Conta do autor da chamada (CALLER_ACCOUNT)

    Essa conta de usuário é usada para gerar credenciais de curta duração para a conta de serviço com privilégios.

  • Conta de serviço com privilégios (PRIV_SA)

    Essa conta de serviço recebe os papéis do IAM necessários para o token de curta duração. Essa é a conta de serviço para a qual o token de curta duração é criado.

Para permitir que CALLER_ACCOUNT crie credenciais de curta duração para PRIV_SA, conceda a CALLER_ACCOUNT o papel de criador de token da conta de serviço (roles/iam.serviceAccountTokenCreator) em PRIV_SA.

Conceda o papel necessário em PRIV_SA:

Console

  1. No Console do Google Cloud, acesse a página Contas de serviço.

    Acessar Contas de serviço

  2. Selecione um projeto.
  3. Clique no endereço de e-mail da conta de serviço com privilégios, PRIV_SA.
  4. Clique na guia Permissões..
  5. Em Principais com acesso a esta conta de serviço, clique em Conceder acesso.
  6. Insira o identificador principal da conta do autor da chamada, CALLER_ACCOUNT.

    Por exemplo, example-user@example.com

  7. Selecione o papel Criador do token da conta de serviço (roles/iam.serviceAccountTokenCreator).
  8. Clique em Salvar para conceder o papel à conta de usuário.

gcloud

O comando gcloud iam service-accounts add-iam-policy-binding concede um papel em uma conta de serviço.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token é gerado.
  • CALLER_ACCOUNT: o endereço de e-mail da conta de usuário que está sendo usada para solicitar o token de curta duração.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Você receberá uma resposta semelhante a esta:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. Leia a política de permissão para PRIV_SA:

    O método serviceAccounts.getIamPolicy recebe a política do IAM de uma conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    Corpo JSON da solicitação:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    Se você não tiver concedido aos papéis à conta de serviço, a resposta conterá apenas um valor etag. Inclua esse valor etag na próxima etapa.

  2. Em seguida, modifique a política de autorização para atribuir a CALLER_ACCOUNT o papel "Criador de token da conta de serviço" (roles/iam.serviceAccountTokenCreator).

    Por exemplo, para modificar a resposta de amostra da etapa anterior, adicione o seguinte:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. Grave a política de permissão atualizada:

    O método serviceAccounts.setIamPolicy define uma política de permissão atualizada para a conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.
    • POLICY: uma representação JSON da política que você quer definir. Para mais informações sobre o formato de uma política, consulte a referência da política.

      Por exemplo, para definir a política de permissão mostrada na etapa anterior, substitua POLICY pela seguinte, em que CALLER_ACCOUNT é a conta de usuário que cria o token de curta duração:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    Corpo JSON da solicitação:

    {
      "policy": POLICY
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    A resposta contém a política de permissão atualizada.

Gerar o JWT

Gere um JWT autoassinado:

REST

O método serviceAccounts.signJwt da API Service Account Credentials assina um JWT usando uma chave privada da conta de serviço gerenciada pelo sistema.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
  • JWT_PAYLOAD: o payload de JWT a ser assinado, que é um objeto JSON contendo um conjunto de declarações do JWT. Inclua as declarações necessárias para o caso de uso pretendido e para atender aos requisitos de validação do serviço que você está chamando. Se você estiver chamando uma API do Google, consulte o Guia de autenticação do Google para conhecer os requisitos da declaração.

    A declaração exp (prazo de validade) precisa ser definida como, no máximo, 12 horas no futuro. Se você estiver chamando uma API do Google, a declaração exp precisará ser definida como, no máximo, uma hora.

    O payload de exemplo a seguir contém declarações para chamar uma API do Google, em que EXP é um carimbo de data/hora inteiro que representa o prazo de validade:

    { \"iss\": \"PRIV_SA\", \"sub\": \"PRIV_SA\", \"aud\": \"https://firestore.googleapis.com/\", \"iat\": 1529350000, \"exp\": EXP }

Método HTTP e URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:signJwt

Corpo JSON da solicitação:

{
  "payload": "JWT_PAYLOAD"
}

Para enviar a solicitação, expanda uma destas opções:

Se a solicitação signJwt for bem-sucedida, o corpo da resposta conterá um blob assinado e o ID da chave de assinatura que foi usada para assiná-lo. Use o valor signedJwt como um token do portador para autenticar diretamente uma solicitação em nome da conta de serviço. O token será válido até o prazo de validade especificado na solicitação:

{
  "keyId": "42ba1e...fc0a",
  "signedJwt": "eyJ0eXAi...NiJ9"
}

Criar um objeto binário autoassinado (blob)

Objetos binários autoassinados, ou blobs, são usados para transmitir dados binários de maneira que o criador dos dados seja conhecido (porque o blob é autoassinado). Os blobs podem ser usados para criar assinaturas, um objeto do Cloud Storage necessário para vários fluxos de autenticação, incluindo URLs assinados. Para mais informações sobre assinaturas, consulte a documentação do Cloud Storage.

Para criar um objeto binário autoassinado, siga estas etapas:

Fornecer as permissões necessárias

Uma solicitação direta envolve duas identidades: o autor da chamada que solicita a credencial e a conta de serviço para a qual a credencial é criada. A configuração das permissões depende se o autor da chamada está se autenticando como uma conta de serviço ou como uma conta de usuário.

Se você quiser executar um comando REST ou a CLI gcloud nesta página em um ambiente de desenvolvimento local, o autor da chamada poderá ser representado por credenciais de usuário. Para cargas de trabalho automatizadas, como um aplicativo em execução no Compute Engine, o autor da chamada precisa ser representado por uma conta de serviço.

Conta de serviço

Quando o aplicativo de chamada usa uma conta de serviço como identidade, os principais a seguir estão envolvidos:

  • Conta de serviço de chamadas (CALLER_SA)

    Essa conta de serviço representa o aplicativo de chamada, que emite a solicitação para as credenciais de curta duração.

  • Conta de serviço com privilégios (PRIV_SA)

    Essa conta de serviço recebe os papéis do IAM necessários para o token de curta duração. Essa é a conta de serviço para a qual o token de curta duração é criado.

Para fornecer permissões CALLER_SA para criar credenciais de curta duração para PRIV_SA, você concede CALLER_SA o papel "Criador de token de conta de serviço" (roles/iam.serviceAccountTokenCreator) emPRIV_SA.

Conceda o papel necessário em PRIV_SA:

Console

  1. No Console do Google Cloud, acesse a página Contas de serviço.

    Acessar Contas de serviço

  2. Selecione um projeto.
  3. Clique no endereço de e-mail da conta de serviço com privilégios, PRIV_SA.
  4. Clique na guia Permissões..
  5. Em Principais com acesso a esta conta de serviço, clique em Conceder acesso.
  6. Insira o endereço de e-mail da conta de serviço do autor da chamada, CALLER_SA.

    Por exemplo, demo@my-project.iam.gserviceaccount.com.

  7. Selecione o papel Criador do token da conta de serviço (roles/iam.serviceAccountTokenCreator).
  8. Clique em Salvar para conceder o papel à conta de serviço.

gcloud

O comando gcloud iam service-accounts add-iam-policy-binding concede um papel em uma conta de serviço.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token é gerado.
  • CALLER_SA: o endereço de e-mail da conta de serviço que representa o aplicativo que está solicitando o token de curta duração.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Você receberá uma resposta semelhante a esta:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. Leia a política de permissão para PRIV_SA:

    O método serviceAccounts.getIamPolicy recebe a política do IAM de uma conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    Corpo JSON da solicitação:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    Se você não tiver concedido aos papéis à conta de serviço, a resposta conterá apenas um valor etag. Inclua esse valor etag na próxima etapa.

  2. Modifique a política de autorização para atribuir a CALLER_SA o papel "Criador de token da conta de serviço" (roles/iam.serviceAccountTokenCreator).

    Por exemplo, para modificar a resposta de amostra da etapa anterior, adicione o seguinte:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. Grave a política de permissão atualizada:

    O método serviceAccounts.setIamPolicy define uma política de permissão atualizada para a conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.
    • POLICY: uma representação JSON da política que você quer definir. Para mais informações sobre o formato de uma política, consulte a referência da política.

      Por exemplo, para definir a política de permissão mostrada na etapa anterior, substitua POLICY pela seguinte, em que CALLER_SA é a conta de serviço que cria o token de curta duração:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    Corpo JSON da solicitação:

    {
      "policy": POLICY
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    A resposta contém a política de permissão atualizada.

Credenciais do usuário

Quando você quiser usar a Google Cloud CLI para gerar tokens de curta duração ou gerar tokens de curta duração a partir de um ambiente de desenvolvimento local, é possível usar uma conta de usuário para gerar os tokens. Muitas vezes, é possível usar sua própria conta de usuário.

Quando você usa uma conta de usuário para gerar tokens de curta duração, as seguintes identidades são envolvidas:

  • Conta do autor da chamada (CALLER_ACCOUNT)

    Essa conta de usuário é usada para gerar credenciais de curta duração para a conta de serviço com privilégios.

  • Conta de serviço com privilégios (PRIV_SA)

    Essa conta de serviço recebe os papéis do IAM necessários para o token de curta duração. Essa é a conta de serviço para a qual o token de curta duração é criado.

Para permitir que CALLER_ACCOUNT crie credenciais de curta duração para PRIV_SA, conceda a CALLER_ACCOUNT o papel de criador de token da conta de serviço (roles/iam.serviceAccountTokenCreator) em PRIV_SA.

Conceda o papel necessário em PRIV_SA:

Console

  1. No Console do Google Cloud, acesse a página Contas de serviço.

    Acessar Contas de serviço

  2. Selecione um projeto.
  3. Clique no endereço de e-mail da conta de serviço com privilégios, PRIV_SA.
  4. Clique na guia Permissões..
  5. Em Principais com acesso a esta conta de serviço, clique em Conceder acesso.
  6. Insira o identificador principal da conta do autor da chamada, CALLER_ACCOUNT.

    Por exemplo, example-user@example.com

  7. Selecione o papel Criador do token da conta de serviço (roles/iam.serviceAccountTokenCreator).
  8. Clique em Salvar para conceder o papel à conta de usuário.

gcloud

O comando gcloud iam service-accounts add-iam-policy-binding concede um papel em uma conta de serviço.

Antes de usar os dados do comando abaixo, faça estas substituições:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token é gerado.
  • CALLER_ACCOUNT: o endereço de e-mail da conta de usuário que está sendo usada para solicitar o token de curta duração.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Você receberá uma resposta semelhante a esta:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. Leia a política de permissão para PRIV_SA:

    O método serviceAccounts.getIamPolicy recebe a política do IAM de uma conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    Corpo JSON da solicitação:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    Você receberá uma resposta JSON semelhante a esta:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    Se você não tiver concedido aos papéis à conta de serviço, a resposta conterá apenas um valor etag. Inclua esse valor etag na próxima etapa.

  2. Em seguida, modifique a política de autorização para atribuir a CALLER_ACCOUNT o papel "Criador de token da conta de serviço" (roles/iam.serviceAccountTokenCreator).

    Por exemplo, para modificar a resposta de amostra da etapa anterior, adicione o seguinte:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. Grave a política de permissão atualizada:

    O método serviceAccounts.setIamPolicy define uma política de permissão atualizada para a conta de serviço.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do projeto do Google Cloud. Os IDs do projeto são strings alfanuméricas, como my-project.
    • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
    • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.
    • POLICY: uma representação JSON da política que você quer definir. Para mais informações sobre o formato de uma política, consulte a referência da política.

      Por exemplo, para definir a política de permissão mostrada na etapa anterior, substitua POLICY pela seguinte, em que CALLER_ACCOUNT é a conta de usuário que cria o token de curta duração:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    Método HTTP e URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    Corpo JSON da solicitação:

    {
      "policy": POLICY
    }
    

    Para enviar a solicitação, expanda uma destas opções:

    A resposta contém a política de permissão atualizada.

Gerar o blob autoassinado

Gere um blob autoassinado para a conta de serviço:

REST

O método serviceAccounts.signBlob da API Service Account Credentials assina um blob usando uma chave privada da conta de serviço gerenciada pelo sistema.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PRIV_SA: o endereço de e-mail da conta de serviço com privilégios para o qual o token de curta duração foi criado.
  • BLOB_PAYLOAD: uma string de bytes codificada em base64. Por exemplo, VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cu.

Método HTTP e URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:signBlob

Corpo JSON da solicitação:

{
  "payload": "BLOB_PAYLOAD"
}

Para enviar a solicitação, expanda uma destas opções:

Se a solicitação signBlob for bem-sucedida, o corpo da resposta conterá um blob assinado e o ID da chave de assinatura que foi usada para assiná-lo. Use o valor signedBlob como um token do portador para autenticar diretamente uma solicitação em nome da conta de serviço. O token será válido até que a chave privada da conta de serviço gerenciada pelo sistema expire. O ID dessa chave é o valor do campo keyId na resposta.

{
  "keyId": "42ba1e...fc0a",
  "signedBlob": "eyJ0eXAi...NiJ9"
}