Crear credenciales de duración reducida para una cuenta de servicio

En esta página se explica cómo crear credenciales de duración reducida para una cuenta de servicio, que puedes usar para suplantar la identidad de la cuenta de servicio. En función del tipo de token que crees, el token de corta duración proporciona la identidad (en el caso de los tokens de ID) o los permisos (en el caso de los tokens de acceso) asociados a la cuenta de servicio.

Si la arquitectura de tu sistema requiere que uses una serie de llamadas de generación de tokens, puedes usar una cadena de delegación formada por varias cuentas de servicio. En la mayoría de los casos, el método directo, tal como se explica en esta página, es suficiente.

Antes de empezar

Crear un token de acceso de corta duración

La mayoría de las APIs de Google aceptan tokens de acceso para la autenticación. Cuando generas un token de acceso mediante la suplantación de identidad de una cuenta de servicio, el token de acceso no incluye un token de actualización, lo que significa que, cuando el token caduque, debes repetir el proceso de suplantación de identidad para generar uno nuevo.

Para obtener más información, consulta Tokens de acceso.

Para crear un token de acceso de corta duración, sigue estos pasos:

Proporcionar los permisos necesarios

Una solicitud directa implica dos identidades: la persona que llama, que solicita la credencial, y la cuenta de servicio para la que se crea la credencial. La forma de configurar los permisos depende de si el llamante se autentica como una cuenta de servicio o como una cuenta de usuario.

Si quieres ejecutar un comando de la API REST o de la CLI de gcloud en esta página en un entorno de desarrollo local, el llamador puede representarse mediante credenciales de usuario. En el caso de las cargas de trabajo automatizadas, como una aplicación que se ejecuta en Compute Engine, el llamante debe estar representado por una cuenta de servicio.

Cuenta de servicio

Cuando la aplicación que llama usa una cuenta de servicio como identidad, se implican las siguientes entidades:

  • Cuenta de servicio de llamadas (CALLER_SA)

    Esta cuenta de servicio representa la aplicación que llama, que emite la solicitud de las credenciales de corta duración.

  • Cuenta de servicio con privilegios (PRIV_SA)

    A esta cuenta de servicio se le conceden los roles de gestión de identidades y accesos necesarios para el token de corta duración. Esta es la cuenta de servicio para la que se crea el token de corta duración.

Para dar permisos a CALLER_SA para crear credenciales de corta duración para PRIV_SA, asigna a CALLER_SA el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) en PRIV_SA.

Asigna el rol necesario en PRIV_SA:

Consola

  1. En la Trusted Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.
  3. Haz clic en la dirección de correo de la cuenta de servicio con privilegios, PRIV_SA.
  4. Haz clic en la pestaña Permisos.
  5. En Principales con acceso a esta cuenta de servicio, haz clic en Conceder acceso.
  6. Introduce la dirección de correo de la cuenta de servicio de la persona que llama, CALLER_SA.

    Por ejemplo, demo@my-project.s3ns-system.iam.gserviceaccount.com.

  7. Selecciona el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator).
  8. Haz clic en Guardar para asignar el rol a la cuenta de servicio.

gcloud

El comando gcloud iam service-accounts add-iam-policy-binding asigna un rol a una cuenta de servicio.

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se genera el token.
  • CALLER_SA: la dirección de correo de la cuenta de servicio que representa la aplicación que solicita el token de corta duración.

Ejecuta el siguiente comando:

Linux, macOS o 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

Deberías recibir una respuesta similar a la siguiente:

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

REST

  1. Lee la política de permitir para PRIV_SA:

    El método serviceAccounts.getIamPolicy obtiene la política de autorización de una cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, despliega una de estas opciones:

    Deberías recibir una respuesta JSON similar a la siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
    

    Si no has concedido ningún rol a la cuenta de servicio, la respuesta solo contendrá un valor etag. Incluye ese valor de etag en el siguiente paso.

  2. Modifica la política de permiso para conceder a CALLER_SA el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator).

    Por ejemplo, para modificar la respuesta de ejemplo del paso anterior, añade lo siguiente:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. Escribe la política de permiso actualizada:

    El método serviceAccounts.setIamPolicy define una política de permiso actualizada para la cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.
    • POLICY: representación JSON de la política que quieres definir. Para obtener más información sobre el formato de una política, consulta la referencia de la política.

      Por ejemplo, para definir la política de permiso que se muestra en el paso anterior, sustituye POLICY por lo siguiente, donde CALLER_SA es la cuenta de servicio que crea el token de corta duración:

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

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

    {
      "policy": POLICY
    }
    

    Para enviar tu solicitud, despliega una de estas opciones:

    La respuesta contiene la política de permiso actualizada.

Credenciales de usuario

Si quieres usar la CLI de Google Cloud para generar tokens de corta duración o generar tokens de corta duración desde un entorno de desarrollo local, puedes usar una cuenta de usuario para generar los tokens. A menudo, puedes usar tu propia cuenta de usuario.

Cuando usas una cuenta de usuario para generar tokens de corta duración, se implican las siguientes identidades:

  • Cuenta de la persona que llama (CALLER_ACCOUNT)

    Esta cuenta de usuario se usa para generar credenciales de corta duración para la cuenta de servicio con privilegios.

  • Cuenta de servicio con privilegios (PRIV_SA)

    A esta cuenta de servicio se le conceden los roles de gestión de identidades y accesos necesarios para el token de corta duración. Esta es la cuenta de servicio para la que se crea el token de corta duración.

Para permitir que CALLER_ACCOUNT cree credenciales de corta duración para PRIV_SA, asigna a CALLER_ACCOUNT el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) en PRIV_SA.

Asigna el rol necesario en PRIV_SA:

Consola

  1. En la Trusted Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.
  3. Haz clic en la dirección de correo de la cuenta de servicio con privilegios, PRIV_SA.
  4. Haz clic en la pestaña Permisos.
  5. En Principales con acceso a esta cuenta de servicio, haz clic en Conceder acceso.
  6. Introduce el identificador principal de la cuenta de la persona que llama, CALLER_ACCOUNT.

    Por ejemplo, //iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com.

  7. Selecciona el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator).
  8. Haz clic en Guardar para asignar el rol a la cuenta de usuario.

gcloud

El comando gcloud iam service-accounts add-iam-policy-binding asigna un rol a una cuenta de servicio.

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se genera el token.
  • CALLER_ACCOUNT: la dirección de correo de la cuenta de usuario que se usa para solicitar el token de corta duración.

Ejecuta el siguiente comando:

Linux, macOS o 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

Deberías recibir una respuesta similar a la siguiente:

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

REST

  1. Lee la política de permitir para PRIV_SA:

    El método serviceAccounts.getIamPolicy obtiene la política de autorización de una cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, despliega una de estas opciones:

    Deberías recibir una respuesta JSON similar a la siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
    

    Si no has concedido ningún rol a la cuenta de servicio, la respuesta solo contendrá un valor etag. Incluye ese valor de etag en el siguiente paso.

  2. Modifica la política de permiso para asignar CALLER_ACCOUNT el rol Creador de tokens de cuenta de servicio ( roles/iam.serviceAccountTokenCreator).

    Por ejemplo, para modificar la respuesta de ejemplo del paso anterior, añade lo siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
  3. Escribe la política de permiso actualizada:

    El método serviceAccounts.setIamPolicy define una política de permiso actualizada para la cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.
    • POLICY: representación JSON de la política que quieres definir. Para obtener más información sobre el formato de una política, consulta la referencia de la política.

      Por ejemplo, para definir la política de permiso que se muestra en el paso anterior, sustituye POLICY por lo siguiente, donde CALLER_ACCOUNT es la cuenta de usuario que crea el token de corta duración:

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

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

    {
      "policy": POLICY
    }
    

    Para enviar tu solicitud, despliega una de estas opciones:

    La respuesta contiene la política de permiso actualizada.

Generar el token de acceso

Puedes generar un token de acceso de OAuth 2.0 mediante la CLI de gcloud, la API REST o las bibliotecas de cliente de Cloud y las bibliotecas de cliente de la API de Google.

Si usas la API REST y tu sistema está configurado para permitir que los tokens tengan una duración ampliada, puedes crear un token con una duración superior a la predeterminada. Google Cloud CLI no admite la configuración de un tiempo de vida para el token.

Los ejemplos que se muestran a continuación están diseñados para usarse en un entorno de desarrollo local. El llamador debe estar representado por una cuenta de usuario, no por una cuenta de servicio.

Genera un token de acceso OAuth 2.0 para una cuenta de servicio:

gcloud

  1. Asegúrate de que has iniciado sesión en gcloud CLI con la cuenta de usuario de la persona que llama.

  2. Genera un token para la cuenta de servicio con el comando gcloud auth print-access-token.

    Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.

    Ejecuta el siguiente comando:

    Linux, macOS o 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

    Deberías recibir una respuesta similar a la siguiente:

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

REST

La API Service Account Credentials serviceAccounts.generateAccessToken genera un token de acceso de OAuth 2.0 para una cuenta de servicio.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
  • LIFETIME: cantidad de tiempo que falta para que caduque el token de acceso, en segundos. Por ejemplo, 300s.

    De forma predeterminada, el tiempo de vida máximo del token es de 1 hora (3600 segundos). Para ampliar el tiempo de vida máximo de estos tokens a 12 horas (43.200 segundos), añade la cuenta de servicio a una política de organización que incluya la restricción de la lista constraints/iam.allowServiceAccountCredentialLifetimeExtension.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

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

Para enviar tu solicitud, despliega una de estas opciones:

Si la solicitud generateAccessToken se ha completado correctamente, el cuerpo de la respuesta contiene un token de acceso de OAuth 2.0 y un tiempo de vencimiento. A continuación, se puede usar el accessToken para autenticar una solicitud en nombre de la cuenta de servicio hasta que se alcance el expireTime:

{
  "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.")

Crear un token de ID de OpenID Connect (OIDC)

Los tokens de ID siguen la especificación de OpenID Connect (OIDC). Un número limitado de servicios y aplicaciones aceptan tokens de ID.

Para obtener más información, consulta Tokens de ID.

Para crear un token de ID, completa estas tareas:

Proporcionar los permisos necesarios

Una solicitud directa implica dos identidades: la persona que llama, que solicita la credencial, y la cuenta de servicio para la que se crea la credencial. La forma de configurar los permisos depende de si el llamante se autentica como una cuenta de servicio o como una cuenta de usuario.

Si quieres ejecutar un comando de la API REST o de la CLI de gcloud en esta página en un entorno de desarrollo local, el llamador puede representarse mediante credenciales de usuario. En el caso de las cargas de trabajo automatizadas, como una aplicación que se ejecuta en Compute Engine, el llamante debe estar representado por una cuenta de servicio.

Cuenta de servicio

Cuando la aplicación que llama usa una cuenta de servicio como identidad, se implican las siguientes entidades:

  • Cuenta de servicio de llamadas (CALLER_SA)

    Esta cuenta de servicio representa la aplicación que llama, que emite la solicitud de las credenciales de corta duración.

  • Cuenta de servicio con privilegios (PRIV_SA)

    A esta cuenta de servicio se le conceden los roles de gestión de identidades y accesos necesarios para el token de corta duración. Esta es la cuenta de servicio para la que se crea el token de corta duración.

Para dar permisos a CALLER_SA para crear credenciales de corta duración para PRIV_SA, asigna a CALLER_SA el rol Creador de tokens de identidad OpenID Connect de cuenta de servicio (roles/iam.serviceAccountOpenIdTokenCreator) en PRIV_SA.

Asigna el rol necesario en PRIV_SA:

Consola

  1. En la Trusted Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.
  3. Haz clic en la dirección de correo de la cuenta de servicio con privilegios, PRIV_SA.
  4. Haz clic en la pestaña Permisos.
  5. En Principales con acceso a esta cuenta de servicio, haz clic en Conceder acceso.
  6. Introduce la dirección de correo de la cuenta de servicio de la persona que llama, CALLER_SA.

    Por ejemplo, demo@my-project.s3ns-system.iam.gserviceaccount.com.

  7. Selecciona el rol Creador de tokens de identidad OpenID Connect de cuenta de servicio (roles/iam.serviceAccountOpenIdTokenCreator).
  8. Haz clic en Guardar para asignar el rol a la cuenta de servicio.

gcloud

El comando gcloud iam service-accounts add-iam-policy-binding asigna un rol a una cuenta de servicio.

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se genera el token.
  • CALLER_SA: la dirección de correo de la cuenta de servicio que representa la aplicación que solicita el token de corta duración.

Ejecuta el siguiente comando:

Linux, macOS o 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

Deberías recibir una respuesta similar a la siguiente:

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

REST

  1. Lee la política de permitir para PRIV_SA:

    El método serviceAccounts.getIamPolicy obtiene la política de autorización de una cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, despliega una de estas opciones:

    Deberías recibir una respuesta JSON similar a la siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
    

    Si no has concedido ningún rol a la cuenta de servicio, la respuesta solo contendrá un valor etag. Incluye ese valor de etag en el siguiente paso.

  2. Modifica la política de permiso para asignar a CALLER_SA el rol Creador de tokens de identidad OpenID Connect de cuenta de servicio (roles/iam.serviceAccountOpenIdTokenCreator).

    Por ejemplo, para modificar la respuesta de ejemplo del paso anterior, añade lo siguiente:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountOpenIdTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. Escribe la política de permiso actualizada:

    El método serviceAccounts.setIamPolicy define una política de permiso actualizada para la cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.
    • POLICY: representación JSON de la política que quieres definir. Para obtener más información sobre el formato de una política, consulta la referencia de la política.

      Por ejemplo, para definir la política de permiso que se muestra en el paso anterior, sustituye POLICY por lo siguiente, donde CALLER_SA es la cuenta de servicio que crea el token de corta duración:

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

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

    {
      "policy": POLICY
    }
    

    Para enviar tu solicitud, despliega una de estas opciones:

    La respuesta contiene la política de permiso actualizada.

Credenciales de usuario

Si quieres usar la CLI de Google Cloud para generar tokens de corta duración o generar tokens de corta duración desde un entorno de desarrollo local, puedes usar una cuenta de usuario para generar los tokens. A menudo, puedes usar tu propia cuenta de usuario.

Cuando usas una cuenta de usuario para generar tokens de corta duración, se implican las siguientes identidades:

  • Cuenta de la persona que llama (CALLER_ACCOUNT)

    Esta cuenta de usuario se usa para generar credenciales de corta duración para la cuenta de servicio con privilegios.

  • Cuenta de servicio con privilegios (PRIV_SA)

    A esta cuenta de servicio se le conceden los roles de gestión de identidades y accesos necesarios para el token de corta duración. Esta es la cuenta de servicio para la que se crea el token de corta duración.

Para permitir que CALLER_ACCOUNT cree credenciales de corta duración para PRIV_SA, asigna a CALLER_ACCOUNT el rol Creador de tokens de identidad de OpenID Connect de cuenta de servicio (roles/iam.serviceAccountOpenIdTokenCreator) en PRIV_SA.

Asigna el rol necesario en PRIV_SA:

Consola

  1. En la Trusted Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.
  3. Haz clic en la dirección de correo de la cuenta de servicio con privilegios, PRIV_SA.
  4. Haz clic en la pestaña Permisos.
  5. En Principales con acceso a esta cuenta de servicio, haz clic en Conceder acceso.
  6. Introduce el identificador principal de la cuenta de la persona que llama, CALLER_ACCOUNT.

    Por ejemplo, //iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com.

  7. Selecciona el rol Creador de tokens de identidad OpenID Connect de cuenta de servicio (roles/iam.serviceAccountOpenIdTokenCreator).
  8. Haz clic en Guardar para asignar el rol a la cuenta de usuario.

gcloud

El comando gcloud iam service-accounts add-iam-policy-binding asigna un rol a una cuenta de servicio.

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se genera el token.
  • CALLER_ACCOUNT: la dirección de correo de la cuenta de usuario que se usa para solicitar el token de corta duración.

Ejecuta el siguiente comando:

Linux, macOS o 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

Deberías recibir una respuesta similar a la siguiente:

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

REST

  1. Lee la política de permitir para PRIV_SA:

    El método serviceAccounts.getIamPolicy obtiene la política de autorización de una cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, despliega una de estas opciones:

    Deberías recibir una respuesta JSON similar a la siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
    

    Si no has concedido ningún rol a la cuenta de servicio, la respuesta solo contendrá un valor etag. Incluye ese valor de etag en el siguiente paso.

  2. Modifica la política de permiso para asignar CALLER_ACCOUNT el rol Creador de tokens de identidad OpenID Connect de cuenta de servicio ( roles/iam.serviceAccountOpenIdTokenCreator).

    Por ejemplo, para modificar la respuesta de ejemplo del paso anterior, añade lo siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountOpenIdTokenCreator",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
  3. Escribe la política de permiso actualizada:

    El método serviceAccounts.setIamPolicy define una política de permiso actualizada para la cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.
    • POLICY: representación JSON de la política que quieres definir. Para obtener más información sobre el formato de una política, consulta la referencia de la política.

      Por ejemplo, para definir la política de permiso que se muestra en el paso anterior, sustituye POLICY por lo siguiente, donde CALLER_ACCOUNT es la cuenta de usuario que crea el token de corta duración:

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

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

    {
      "policy": POLICY
    }
    

    Para enviar tu solicitud, despliega una de estas opciones:

    La respuesta contiene la política de permiso actualizada.

Generar el token de ID

Puedes generar un token de ID de OpenID Connect (OIDC) mediante la CLI de gcloud, la API REST o las bibliotecas de cliente de Cloud y las bibliotecas de cliente de la API de Google.

Los ejemplos que se muestran a continuación están diseñados para usarse en un entorno de desarrollo local. El llamador debe estar representado por una cuenta de usuario, no por una cuenta de servicio.

Los tokens de ID de OIDC son válidos durante 1 hora (3600 segundos).

Genera un token de ID de OIDC firmado por Google para una cuenta de servicio:

gcloud

  1. Asegúrate de que has iniciado sesión en gcloud CLI con la cuenta de usuario de la persona que llama.

  2. Genera un token para la cuenta de servicio con el comando gcloud auth print-identity-token.

    Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • AUDIENCE_NAME: la audiencia del token, normalmente la URL de la aplicación o el servicio al que se usará el token para acceder.
      • Ejecuta el siguiente comando:

        Linux, macOS o 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"

        Deberías recibir una respuesta similar a la siguiente:

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

REST

El método serviceAccounts.generateIdToken de la API Service Account Credentials genera un token de ID de OIDC para una cuenta de servicio.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
  • AUDIENCE_NAME: la audiencia del token, normalmente la URL de la aplicación o el servicio al que se usará el token para acceder.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

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

Para enviar tu solicitud, despliega una de estas opciones:

Si la solicitud generateId se ha completado correctamente, el cuerpo de la respuesta contiene un token de ID válido durante 1 hora. La token se puede usar para autenticar una solicitud en nombre de la cuenta de servicio:

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

Crear un JSON Web Token (JWT) autofirmado

Los JSON Web Tokens (JWTs) autofirmados son útiles en diversas situaciones:

  • Comunicación segura entre tus propias aplicaciones. En este caso, una aplicación puede firmar un token que otra aplicación puede verificar con fines de autenticación.
  • Tratar una cuenta de servicio como un proveedor de identidades firmando un JWT que contenga reclamaciones arbitrarias sobre un usuario, una cuenta o un dispositivo.

Para crear un JWT, completa estas tareas:

Proporcionar los permisos necesarios

Una solicitud directa implica dos identidades: la persona que llama, que solicita la credencial, y la cuenta de servicio para la que se crea la credencial. La forma de configurar los permisos depende de si el llamante se autentica como una cuenta de servicio o como una cuenta de usuario.

Si quieres ejecutar un comando de la API REST o de la CLI de gcloud en esta página en un entorno de desarrollo local, el llamador puede representarse mediante credenciales de usuario. En el caso de las cargas de trabajo automatizadas, como una aplicación que se ejecuta en Compute Engine, el llamante debe estar representado por una cuenta de servicio.

Cuenta de servicio

Cuando la aplicación que llama usa una cuenta de servicio como identidad, se implican las siguientes entidades:

  • Cuenta de servicio de llamadas (CALLER_SA)

    Esta cuenta de servicio representa la aplicación que llama, que emite la solicitud de las credenciales de corta duración.

  • Cuenta de servicio con privilegios (PRIV_SA)

    A esta cuenta de servicio se le conceden los roles de gestión de identidades y accesos necesarios para el token de corta duración. Esta es la cuenta de servicio para la que se crea el token de corta duración.

Para dar permisos a CALLER_SA para crear credenciales de corta duración para PRIV_SA, asigna a CALLER_SA el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) en PRIV_SA.

Asigna el rol necesario en PRIV_SA:

Consola

  1. En la Trusted Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.
  3. Haz clic en la dirección de correo de la cuenta de servicio con privilegios, PRIV_SA.
  4. Haz clic en la pestaña Permisos.
  5. En Principales con acceso a esta cuenta de servicio, haz clic en Conceder acceso.
  6. Introduce la dirección de correo de la cuenta de servicio de la persona que llama, CALLER_SA.

    Por ejemplo, demo@my-project.s3ns-system.iam.gserviceaccount.com.

  7. Selecciona el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator).
  8. Haz clic en Guardar para asignar el rol a la cuenta de servicio.

gcloud

El comando gcloud iam service-accounts add-iam-policy-binding asigna un rol a una cuenta de servicio.

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se genera el token.
  • CALLER_SA: la dirección de correo de la cuenta de servicio que representa la aplicación que solicita el token de corta duración.

Ejecuta el siguiente comando:

Linux, macOS o 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

Deberías recibir una respuesta similar a la siguiente:

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

REST

  1. Lee la política de permitir para PRIV_SA:

    El método serviceAccounts.getIamPolicy obtiene la política de autorización de una cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, despliega una de estas opciones:

    Deberías recibir una respuesta JSON similar a la siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
    

    Si no has concedido ningún rol a la cuenta de servicio, la respuesta solo contendrá un valor etag. Incluye ese valor de etag en el siguiente paso.

  2. Modifica la política de permiso para conceder a CALLER_SA el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator).

    Por ejemplo, para modificar la respuesta de ejemplo del paso anterior, añade lo siguiente:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. Escribe la política de permiso actualizada:

    El método serviceAccounts.setIamPolicy define una política de permiso actualizada para la cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.
    • POLICY: representación JSON de la política que quieres definir. Para obtener más información sobre el formato de una política, consulta la referencia de la política.

      Por ejemplo, para definir la política de permiso que se muestra en el paso anterior, sustituye POLICY por lo siguiente, donde CALLER_SA es la cuenta de servicio que crea el token de corta duración:

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

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

    {
      "policy": POLICY
    }
    

    Para enviar tu solicitud, despliega una de estas opciones:

    La respuesta contiene la política de permiso actualizada.

Credenciales de usuario

Si quieres usar la CLI de Google Cloud para generar tokens de corta duración o generar tokens de corta duración desde un entorno de desarrollo local, puedes usar una cuenta de usuario para generar los tokens. A menudo, puedes usar tu propia cuenta de usuario.

Cuando usas una cuenta de usuario para generar tokens de corta duración, se implican las siguientes identidades:

  • Cuenta de la persona que llama (CALLER_ACCOUNT)

    Esta cuenta de usuario se usa para generar credenciales de corta duración para la cuenta de servicio con privilegios.

  • Cuenta de servicio con privilegios (PRIV_SA)

    A esta cuenta de servicio se le conceden los roles de gestión de identidades y accesos necesarios para el token de corta duración. Esta es la cuenta de servicio para la que se crea el token de corta duración.

Para permitir que CALLER_ACCOUNT cree credenciales de corta duración para PRIV_SA, asigna a CALLER_ACCOUNT el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) en PRIV_SA.

Asigna el rol necesario en PRIV_SA:

Consola

  1. En la Trusted Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.
  3. Haz clic en la dirección de correo de la cuenta de servicio con privilegios, PRIV_SA.
  4. Haz clic en la pestaña Permisos.
  5. En Principales con acceso a esta cuenta de servicio, haz clic en Conceder acceso.
  6. Introduce el identificador principal de la cuenta de la persona que llama, CALLER_ACCOUNT.

    Por ejemplo, //iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com.

  7. Selecciona el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator).
  8. Haz clic en Guardar para asignar el rol a la cuenta de usuario.

gcloud

El comando gcloud iam service-accounts add-iam-policy-binding asigna un rol a una cuenta de servicio.

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se genera el token.
  • CALLER_ACCOUNT: la dirección de correo de la cuenta de usuario que se usa para solicitar el token de corta duración.

Ejecuta el siguiente comando:

Linux, macOS o 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

Deberías recibir una respuesta similar a la siguiente:

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

REST

  1. Lee la política de permitir para PRIV_SA:

    El método serviceAccounts.getIamPolicy obtiene la política de autorización de una cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, despliega una de estas opciones:

    Deberías recibir una respuesta JSON similar a la siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
    

    Si no has concedido ningún rol a la cuenta de servicio, la respuesta solo contendrá un valor etag. Incluye ese valor de etag en el siguiente paso.

  2. Modifica la política de permiso para asignar CALLER_ACCOUNT el rol Creador de tokens de cuenta de servicio ( roles/iam.serviceAccountTokenCreator).

    Por ejemplo, para modificar la respuesta de ejemplo del paso anterior, añade lo siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
  3. Escribe la política de permiso actualizada:

    El método serviceAccounts.setIamPolicy define una política de permiso actualizada para la cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.
    • POLICY: representación JSON de la política que quieres definir. Para obtener más información sobre el formato de una política, consulta la referencia de la política.

      Por ejemplo, para definir la política de permiso que se muestra en el paso anterior, sustituye POLICY por lo siguiente, donde CALLER_ACCOUNT es la cuenta de usuario que crea el token de corta duración:

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

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

    {
      "policy": POLICY
    }
    

    Para enviar tu solicitud, despliega una de estas opciones:

    La respuesta contiene la política de permiso actualizada.

Generar el JWT

Genera un JWT autofirmado:

REST

El método serviceAccounts.signJwt de la API Service Account Credentials firma un JWT con la clave privada gestionada por el sistema de una cuenta de servicio.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
  • JWT_PAYLOAD: la carga útil de JWT que se va a firmar, que es un objeto JSON que contiene un conjunto de reclamaciones de JWT. Incluye las reclamaciones necesarias para el caso práctico que quieras y para cumplir los requisitos de validación del servicio al que llamas. Si llamas a una API de Google, consulta la guía de autenticación de Google para ver los requisitos de las reclamaciones.

    La reclamación exp (hora de vencimiento) no debe ser posterior a 12 horas. Si llamas a una API de Google, la reclamación exp no debe establecerse con más de una hora de antelación.

    La siguiente carga útil de ejemplo contiene reclamaciones para llamar a una API de Google, donde EXP es una marca de tiempo entera que representa la hora de vencimiento:

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

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

{
  "payload": "JWT_PAYLOAD"
}

Para enviar tu solicitud, despliega una de estas opciones:

Si la solicitud signJwt se ha completado correctamente, el cuerpo de la respuesta contiene un JWT firmado y el ID de la clave de firma que se ha usado para firmar el JWT. Puedes usar el valor signedJwt como token de portador para autenticar directamente una solicitud en nombre de la cuenta de servicio. El token es válido hasta la hora de vencimiento especificada en la solicitud:

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

Crear un objeto binario (blob) autofirmado

Los objetos binarios autofirmados, o blobs, se usan para transmitir datos binarios de forma que se conozca el origen de los datos (porque el blob está autofirmado). Los blobs se pueden usar para crear firmas, un objeto de Cloud Storage necesario para varios flujos de autenticación, incluidas las URLs firmadas. Para obtener información sobre las firmas, consulta la documentación de Cloud Storage.

Para crear un objeto binario autofirmado, sigue estos pasos:

Proporcionar los permisos necesarios

Una solicitud directa implica dos identidades: la persona que llama, que solicita la credencial, y la cuenta de servicio para la que se crea la credencial. La forma de configurar los permisos depende de si el llamante se autentica como una cuenta de servicio o como una cuenta de usuario.

Si quieres ejecutar un comando de la API REST o de la CLI de gcloud en esta página en un entorno de desarrollo local, el llamador puede representarse mediante credenciales de usuario. En el caso de las cargas de trabajo automatizadas, como una aplicación que se ejecuta en Compute Engine, el llamante debe estar representado por una cuenta de servicio.

Cuenta de servicio

Cuando la aplicación que llama usa una cuenta de servicio como identidad, se implican las siguientes entidades:

  • Cuenta de servicio de llamadas (CALLER_SA)

    Esta cuenta de servicio representa la aplicación que llama, que emite la solicitud de las credenciales de corta duración.

  • Cuenta de servicio con privilegios (PRIV_SA)

    A esta cuenta de servicio se le conceden los roles de gestión de identidades y accesos necesarios para el token de corta duración. Esta es la cuenta de servicio para la que se crea el token de corta duración.

Para dar permisos a CALLER_SA para crear credenciales de corta duración para PRIV_SA, asigna a CALLER_SA el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) en PRIV_SA.

Asigna el rol necesario en PRIV_SA:

Consola

  1. En la Trusted Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.
  3. Haz clic en la dirección de correo de la cuenta de servicio con privilegios, PRIV_SA.
  4. Haz clic en la pestaña Permisos.
  5. En Principales con acceso a esta cuenta de servicio, haz clic en Conceder acceso.
  6. Introduce la dirección de correo de la cuenta de servicio de la persona que llama, CALLER_SA.

    Por ejemplo, demo@my-project.s3ns-system.iam.gserviceaccount.com.

  7. Selecciona el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator).
  8. Haz clic en Guardar para asignar el rol a la cuenta de servicio.

gcloud

El comando gcloud iam service-accounts add-iam-policy-binding asigna un rol a una cuenta de servicio.

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se genera el token.
  • CALLER_SA: la dirección de correo de la cuenta de servicio que representa la aplicación que solicita el token de corta duración.

Ejecuta el siguiente comando:

Linux, macOS o 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

Deberías recibir una respuesta similar a la siguiente:

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

REST

  1. Lee la política de permitir para PRIV_SA:

    El método serviceAccounts.getIamPolicy obtiene la política de autorización de una cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, despliega una de estas opciones:

    Deberías recibir una respuesta JSON similar a la siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
    

    Si no has concedido ningún rol a la cuenta de servicio, la respuesta solo contendrá un valor etag. Incluye ese valor de etag en el siguiente paso.

  2. Modifica la política de permiso para conceder a CALLER_SA el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator).

    Por ejemplo, para modificar la respuesta de ejemplo del paso anterior, añade lo siguiente:

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. Escribe la política de permiso actualizada:

    El método serviceAccounts.setIamPolicy define una política de permiso actualizada para la cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.
    • POLICY: representación JSON de la política que quieres definir. Para obtener más información sobre el formato de una política, consulta la referencia de la política.

      Por ejemplo, para definir la política de permiso que se muestra en el paso anterior, sustituye POLICY por lo siguiente, donde CALLER_SA es la cuenta de servicio que crea el token de corta duración:

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

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

    {
      "policy": POLICY
    }
    

    Para enviar tu solicitud, despliega una de estas opciones:

    La respuesta contiene la política de permiso actualizada.

Credenciales de usuario

Si quieres usar la CLI de Google Cloud para generar tokens de corta duración o generar tokens de corta duración desde un entorno de desarrollo local, puedes usar una cuenta de usuario para generar los tokens. A menudo, puedes usar tu propia cuenta de usuario.

Cuando usas una cuenta de usuario para generar tokens de corta duración, se implican las siguientes identidades:

  • Cuenta de la persona que llama (CALLER_ACCOUNT)

    Esta cuenta de usuario se usa para generar credenciales de corta duración para la cuenta de servicio con privilegios.

  • Cuenta de servicio con privilegios (PRIV_SA)

    A esta cuenta de servicio se le conceden los roles de gestión de identidades y accesos necesarios para el token de corta duración. Esta es la cuenta de servicio para la que se crea el token de corta duración.

Para permitir que CALLER_ACCOUNT cree credenciales de corta duración para PRIV_SA, asigna a CALLER_ACCOUNT el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) en PRIV_SA.

Asigna el rol necesario en PRIV_SA:

Consola

  1. En la Trusted Cloud consola, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.
  3. Haz clic en la dirección de correo de la cuenta de servicio con privilegios, PRIV_SA.
  4. Haz clic en la pestaña Permisos.
  5. En Principales con acceso a esta cuenta de servicio, haz clic en Conceder acceso.
  6. Introduce el identificador principal de la cuenta de la persona que llama, CALLER_ACCOUNT.

    Por ejemplo, //iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com.

  7. Selecciona el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator).
  8. Haz clic en Guardar para asignar el rol a la cuenta de usuario.

gcloud

El comando gcloud iam service-accounts add-iam-policy-binding asigna un rol a una cuenta de servicio.

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se genera el token.
  • CALLER_ACCOUNT: la dirección de correo de la cuenta de usuario que se usa para solicitar el token de corta duración.

Ejecuta el siguiente comando:

Linux, macOS o 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

Deberías recibir una respuesta similar a la siguiente:

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

REST

  1. Lee la política de permitir para PRIV_SA:

    El método serviceAccounts.getIamPolicy obtiene la política de autorización de una cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, despliega una de estas opciones:

    Deberías recibir una respuesta JSON similar a la siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
    

    Si no has concedido ningún rol a la cuenta de servicio, la respuesta solo contendrá un valor etag. Incluye ese valor de etag en el siguiente paso.

  2. Modifica la política de permiso para asignar CALLER_ACCOUNT el rol Creador de tokens de cuenta de servicio ( roles/iam.serviceAccountTokenCreator).

    Por ejemplo, para modificar la respuesta de ejemplo del paso anterior, añade lo siguiente:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "principal://iam.googleapis.com/locations/global/workforcePools/my-pool/subject/my-user@example.com"
          ]
        }
      ]
    }
  3. Escribe la política de permiso actualizada:

    El método serviceAccounts.setIamPolicy define una política de permiso actualizada para la cuenta de servicio.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: tu ID de proyecto. Trusted Cloud Los IDs de proyecto son cadenas alfanuméricas, como my-project.
    • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
    • POLICY_VERSION: la versión de la política que se va a devolver. En las solicitudes se debe especificar la versión de la política más reciente, que es la versión 3. Consulta Especificar una versión de la política al obtener una política para obtener más información.
    • POLICY: representación JSON de la política que quieres definir. Para obtener más información sobre el formato de una política, consulta la referencia de la política.

      Por ejemplo, para definir la política de permiso que se muestra en el paso anterior, sustituye POLICY por lo siguiente, donde CALLER_ACCOUNT es la cuenta de usuario que crea el token de corta duración:

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

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

    {
      "policy": POLICY
    }
    

    Para enviar tu solicitud, despliega una de estas opciones:

    La respuesta contiene la política de permiso actualizada.

Generar el blob autofirmado

Genera un blob autofirmado para la cuenta de servicio:

REST

El método serviceAccounts.signBlob de la API Service Account Credentials firma un blob mediante la clave privada gestionada por el sistema de una cuenta de servicio.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PRIV_SA: la dirección de correo de la cuenta de servicio con privilegios para la que se crea el token de corta duración.
  • BLOB_PAYLOAD: cadena de bytes codificada en base64. Por ejemplo, VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cu.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

{
  "payload": "BLOB_PAYLOAD"
}

Para enviar tu solicitud, despliega una de estas opciones:

Si la solicitud signBlob se ha completado correctamente, el cuerpo de la respuesta contiene un blob firmado y el ID de la clave de firma que se ha usado para firmar el blob. Puedes usar el valor signedBlob como token de portador para autenticar directamente una solicitud en nombre de la cuenta de servicio. El token es válido hasta que caduque la clave privada gestionada por el sistema de la cuenta de servicio. El ID de esta clave es el valor del campo keyId de la respuesta.

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