Os agentes hospedados em Google Cloud podem usar a própria identidade para autenticar ferramentas e serviços hospedados em tempos de execução Google Cloud , como o Cloud Run ou o Google Kubernetes Engine (GKE), solicitando um token de ID do OpenID Connect (OIDC) da identidade do agente. Os agentes também podem usar esses tokens de ID para autenticar plataformas de nuvem de terceiros (como Amazon Web Services [AWS] e Microsoft Azure), APIs personalizadas, gateways de API e back-ends locais.
Quando um agente age por conta própria para acessar um serviço externo, a identidade do agente emite um token de ID do OpenID Connect (OIDC). Esse JSON Web Token (JWT) declara a identidade SPIFFE do agente e é assinado pelas chaves do emissor para o domínio de confiança do agente (pool de identidades de carga de trabalho gerenciado). Sistemas externos podem verificar esses tokens sem Google Cloud credenciais ou SDKs usando endpoints públicos hospedados pelo Google Cloud Security Token Service:
- Um endpoint do OpenID Connect Discovery 1.0
(
/.well-known/openid-configuration) que publica os metadados do provedor OpenID e o endpoint de chave pública (jwks_uri). - Um endpoint do conjunto de chaves da Web JSON (JWKS) (
/openid/jwks) que veicula as chaves públicas ativas usadas para verificar assinaturas em tokens de ID do agente.
Antes de começar
- Verifique se você escolheu o método de autenticação correto. Confira como as identidades SPIFFE, os domínios de confiança e as credenciais do agente funcionam na visão geral da identidade do agente.
- Crie e implante um agente com a Identidade do agente ativada.
- Verifique se o serviço ou provedor de identidade externo atende aos seguintes
requisitos:
- Oferece suporte à validação de JSON Web Tokens (JWTs) usando OpenID Connect Discovery 1.0 e conjuntos de chaves da Web JSON (JWKS).
- Pode enviar solicitações HTTPS de saída para
https://sts.googleapis.come recuperar os metadados do provedor OpenID e as chaves de assinatura públicas.
- Identifique os seguintes valores de configuração para seu agente e serviço externo de destino:
- URL do emissor (declaração
iss): o URL do emissor do pool de identidades da carga de trabalho da sua organização (https://sts.googleapis.com/v1/organizations/ORGANIZATION_ID/locations/global/workloadIdentityPools/TRUST_DOMAIN) ou projeto (https://sts.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/TRUST_DOMAIN). - Público-alvo permitido (declaração
aud): o URI de público-alvo que o serviço externo ou o provedor de identidade espera ao validar tokens de ID.
- URL do emissor (declaração
- Verifique se você tem os papéis necessários para concluir esta tarefa.
Funções exigidas
Para receber as permissões necessárias para implantar um agente com a identidade do agente, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:
-
Implante um agente no Agent Runtime na Gemini Enterprise Agent Platform:
Usuário da Vertex AI (
roles/aiplatform.user) -
Implante um serviço de agente no Cloud Run:
Administrador do Cloud Run (
roles/run.admin)
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Esses papéis predefinidos contêm as permissões necessárias para implantar um agente com a identidade do agente. Para acessar as permissões exatas necessárias, expanda a seção Permissões necessárias:
Permissões necessárias
As seguintes permissões são necessárias para implantar um agente com a identidade do agente:
-
Implante um agente no Agent Runtime na Gemini Enterprise Agent Platform:
-
aiplatform.reasoningEngines.create -
aiplatform.reasoningEngines.update
-
-
Implante um serviço de agente no Cloud Run:
-
run.services.create -
run.services.update
-
Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.
Receber um token de ID do OIDC para um agente
Para configurar o agente para receber e enviar um token de ID do OIDC a um serviço externo, conclua as seguintes tarefas:
- Configurar seu agente com a identidade do agente
- Solicitar um token de ID do OIDC no código do aplicativo
Configurar seu agente com a identidade do agente
Ative a identidade do agente ao implantar o agente:
Se você implantar seu agente no Agent Runtime na Gemini Enterprise Agent Platform , defina
identity_typecomoAGENT_IDENTITY:remote_app = client.agent_engines.create( agent=app, config={ "identity_type": types.IdentityType.AGENT_IDENTITY, "requirements": ["google-cloud-aiplatform[agent_engines,adk]"], }, )Se você implantar um serviço de agente em contêiner no Cloud Run, transmita a flag
--identity-type=agent-identity:gcloud run deploy SERVICE_NAME \ --image=IMAGE_URL \ --identity-type=agent-identity \ --no-allow-unauthenticated
Substitua:
SERVICE_NAME: o nome do seu serviço do Cloud Run.IMAGE_URL: o URL da imagem do contêiner do seu agente.
Solicitar um token de ID do OIDC no código do aplicativo
No código do aplicativo do seu agente, use a biblioteca de cliente de autenticação do Google para solicitar um token de ID do OIDC para seu público-alvo externo. A biblioteca de cliente processa a geração de tokens, o armazenamento em cache local e a renovação automática do servidor de metadados.
Por padrão, os tokens de ID do OIDC emitidos para públicos-alvo externos não são vinculados ao certificado de tempo de execução.
O exemplo a seguir usa a biblioteca google-auth para solicitar um token de ID do OIDC
e anexá-lo como um token Bearer em uma solicitação de saída:
Python
from google.auth.transport.requests import AuthorizedSession from google.oauth2 import id_token # 1. Specify the audience expected by the external receiver # (for example, AWS Bedrock AgentCore or your external service URL). target_audience = "https://EXTERNAL_SERVICE_AUDIENCE" # 2. Create ID token credentials and an AuthorizedSession, which handles # local token caching, automatic renewal before expiry, and the Bearer header. credentials = id_token.fetch_id_token_credentials(audience=target_audience) authed_session = AuthorizedSession(credentials) # 3. Send the authenticated request to the external service. response = authed_session.post( "https://EXTERNAL_SERVICE_ENDPOINT", json={"prompt": "Hello from Agent"}, )
Substitua:
EXTERNAL_SERVICE_AUDIENCE: o URI do público-alvo esperado pelo serviço de recebimento (por exemplo,bedrock.us-east-1.amazonaws.comouapi.example.com).EXTERNAL_SERVICE_ENDPOINT: o URL da API externa ou do endpoint de back-end que seu agente chama.
Para instruções e exemplos de biblioteca de cliente em outras linguagens de programação
(incluindo Go, Node.js e Java), consulte
Receber um token de ID. As versões atuais das biblioteca de cliente para essas linguagens oferecem suporte a --identity-type=agent-identity, mas não usam tokens vinculados por padrão.
Verificar tokens de ID de identidade do agente
Quando um serviço externo recebe um token de ID do OIDC do seu agente, verifique o token usando uma das seguintes abordagens com base no serviço de destino:
- Plataformas de nuvem gerenciadas (como Cloud Run, AWS ou Microsoft Azure): use a federação de identidade da carga de trabalho integrada para verificar tokens recebidos sem escrever um código de verificação personalizado.
- Serviços de back-end personalizados, gateways de API e cargas de trabalho locais: verifique os tokens de maneira programática usando os endpoints públicos de descoberta do OpenID Connect e JWKS.
Usar a federação de identidade da carga de trabalho integrada
Se o serviço de recebimento for executado em uma plataforma de nuvem que ofereça suporte à autenticação integrada do IAM ou à federação de identidade da carga de trabalho do OIDC, não será necessário escrever um código personalizado de verificação de token:
Cloud Run: se o serviço de recebimento for executado no Cloud Run com entrada autenticada (
--no-allow-unauthenticated), o Cloud Run vai validar os tokens de identidade do agente na camada de entrada. Conceda ao agente de chamada o papel de Invocador do Cloud Run (roles/run.invoker) no serviço de recebimento. Para mais informações, consulte Autenticar servidores MCP no Cloud Run.Se o serviço permitir entrada não autenticada e verificar tokens no código do aplicativo, consulte Verificar tokens de maneira programática.
Amazon Bedrock: configure a autenticação JWT de entrada especificando o URL de descoberta ou de emissor doGoogle Cloud Security Token Service e seu público-alvo esperado. Para instruções, consulte Configurar um autorizador JWT de entrada na documentação da AWS.
Microsoft Entra ID: configure uma credencial de identidade federada com o cenário Outro emissor. Especifique o URL do emissor do serviço de token de segurança Google Cloud , o público-alvo esperado e o identificador do assunto (declaração
sub). Para instruções, consulte Criar uma relação de confiança entre um app e um provedor de identidade externo na documentação do Microsoft Learn.
Verificar tokens de maneira programática
Se o agente enviar solicitações para uma API personalizada, um microsserviço, um gateway de API ou uma carga de trabalho local, o serviço de recebimento precisará verificar o token de ID do OIDC recebido antes de conceder acesso. Normalmente, o agente transmite esse token no cabeçalho HTTP Authorization: Bearer TOKEN.
Para verificar os tokens de ID recebidos de forma programática, conclua as seguintes tarefas:
- Extrair e validar o URL do emissor do token
- Descobrir e armazenar em cache as chaves de assinatura públicas
- Verificar a assinatura e as declarações do token
- Autorizar a identidade SPIFFE do agente
Extrair e validar o URL do emissor do token
Quando uma solicitação chega, leia o payload do JWT não verificado para extrair a declaração iss (emissor). Essa declaração contém o URL do pool de identidade da carga de trabalho para o domínio de confiança do agente. Esse URL
serve como o URL base para o documento de descoberta e as chaves de assinatura públicas.
Antes de fazer qualquer solicitação de rede de saída, verifique se a declaração iss corresponde
ao URL esperado do pool de identidades da carga de trabalho do Serviço de token de segurança Google Cloud para sua
organização ou projeto:
Domínios de confiança no nível da organização:
https://sts.googleapis.com/v1/organizations/ORGANIZATION_ID/locations/global/workloadIdentityPools/TRUST_DOMAIN
Por exemplo, para uma organização com ID
123456789012,TRUST_DOMAINéagents.global.org-123456789012.system.id.goog.Domínios de confiança no nível do projeto (para projetos sem uma organização):
https://sts.googleapis.com/v1/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/TRUST_DOMAIN
Por exemplo, para um projeto com o número
9876543210,TRUST_DOMAINéagents.global.proj-9876543210.system.id.goog.
Descobrir e armazenar em cache as chaves de assinatura públicas
Depois de validar o URL do emissor, recupere e armazene em cache as chaves públicas de assinatura do Serviço de token de segurança Google Cloud :
-
Consulte o endpoint de descoberta do OpenID Connect: adicione
/.well-known/openid-configurationao URL base do emissor e envie uma solicitação HTTPGETnão autenticada:Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:
ORGANIZATION_ID: o ID da organização Google Cloud. Para um projeto sem uma organização, substituaorganizations/ORGANIZATION_IDporprojects/PROJECT_NUMBER.TRUST_DOMAIN: o ID do pool de identidades da carga de trabalho para o domínio de confiança do seu agente (por exemplo,agents.global.org-123456789012.system.id.goog).
Método HTTP e URL:
GET https://sts.googleapis.com/v1/organizations/ORGANIZATION_ID/locations/global/workloadIdentityPools/TRUST_DOMAIN/.well-known/openid-configuration
Para enviar a solicitação, expanda uma destas opções:
Uma solicitação bem-sucedida retorna um status
HTTP 200 OKe um objeto JSON que contém os metadados do provedor OpenID, incluindo o campojwks_uri:{ "issuer": "https://sts.googleapis.com/v1/organizations/123456789012/locations/global/workloadIdentityPools/agents.global.org-123456789012.system.id.goog", "jwks_uri": "https://sts.googleapis.com/v1/organizations/123456789012/locations/global/workloadIdentityPools/agents.global.org-123456789012.system.id.goog/openid/jwks", "authorization_endpoint": "https://sts.googleapis.com/v1/organizations/123456789012/locations/global/workloadIdentityPools/agents.global.org-123456789012.system.id.goog/authorize", "token_endpoint": "https://sts.googleapis.com/v1/organizations/123456789012/locations/global/workloadIdentityPools/agents.global.org-123456789012.system.id.goog/token", "response_types_supported": [ "id_token" ], "subject_types_supported": [ "public" ], "id_token_signing_alg_values_supported": [ "RS256" ] } -
Consultar o endpoint do conjunto de chaves da Web JSON (JWKS): envie uma solicitação HTTP
GETnão autenticada para o URLjwks_uriretornado nos metadados do provedor OpenID:Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:
ORGANIZATION_ID: o ID da organização Google Cloud. Para um projeto sem uma organização, substituaorganizations/ORGANIZATION_IDporprojects/PROJECT_NUMBER.TRUST_DOMAIN: o ID do pool de identidades da carga de trabalho para o domínio de confiança do seu agente (por exemplo,agents.global.org-123456789012.system.id.goog).
Método HTTP e URL:
GET https://sts.googleapis.com/v1/organizations/ORGANIZATION_ID/locations/global/workloadIdentityPools/TRUST_DOMAIN/openid/jwks
Para enviar a solicitação, expanda uma destas opções:
Uma solicitação bem-sucedida retorna um status
HTTP 200 OKe um objeto JSON que contém uma matriz de chaves públicas formatadas de acordo com a RFC 7517:{ "keys": [ { "kty": "RSA", "use": "sig", "alg": "RS256", "kid": "4d1933f8e6c4e0b512c140989f6655c68997...", "n": "uQn4zN_1mQ0VpGv82-Wp3w...", "e": "AQAB" } ] } -
Armazenar em cache o documento de descoberta e as chaves: as respostas do endpoint de descoberta do OpenID Connect e do endpoint JWKS incluem o seguinte cabeçalho de cache HTTP:
Cache-Control: public, max-age=86400, must-revalidate
Faça o cache do documento de descoberta e do JWKS por até 24 horas (
86400segundos) para melhorar o desempenho da verificação e evitar a limitação de taxa.OGoogle Cloud alterna periodicamente as chaves de assinatura privada e pública para pools de identidades de carga de trabalho. Se o verificador receber um token com um
kid(ID da chave) que não está no cache de chaves local, busque um JWKS atualizado no endpoint/openid/jwksantes de rejeitar o token.Se você encontrar erros HTTP ao consultar os endpoints de descoberta ou JWKS, consulte Solução de problemas de autenticação de identidade do agente.
Verificar a assinatura e as declarações do token
Para verificar criptograficamente a assinatura do token e validar as declarações do JWT, use uma biblioteca padrão de verificação do OIDC ou JWT (como Google Tink) e faça o seguinte:
- Assinatura: encontre a chave pública no JWKS em cache que corresponda ao
kid(ID da chave) no cabeçalho do JWT. Valide a assinatura usando o algoritmo especificado no campoalg(RS256). Para compatibilidade futura, inspecione os camposalgektyno JWKS dinamicamente em vez de codificar tipos de algoritmos. - Emissor (
iss): confirme se a declaraçãoisscorresponde ao URL do emissor do pool de identidades da carga de trabalhoGoogle Cloud confiável para seu domínio de confiança. - Público-alvo (
aud): confirme se a declaraçãoaudcorresponde ao identificador de público-alvo configurado do seu serviço. - Horário de emissão (
iat) e horário de expiração (exp): verifique se a declaraçãoiatestá no passado e se o horário atual é anterior à declaraçãoexp(permitindo uma pequena tolerância de diferença de relógio, como de 1 a 2 minutos).
O exemplo a seguir usa o Google Tink (tink.jwt) para verificar um token de ID de identidade do agente em relação a um payload JSON JWKS:
Python
import tink from tink import jwt # Initialize Tink JWT signature primitives (call once at application startup). jwt.register_jwt_signature() def verify_agent_identity_token( token: str, jwks_json: str, expected_issuer: str, expected_audience: str, ) -> jwt.VerifiedJwt: """Verifies an Agent Identity JWT against a JWKS JSON string using Tink. Args: token: The compact serialized JWT string. jwks_json: The JWKS JSON string fetched from the STS pool endpoint. expected_issuer: The expected token issuer ('iss' claim). expected_audience: The expected token audience ('aud' claim). Returns: jwt.VerifiedJwt: The verified JWT claims object. Raises: tink.TinkError: If the JWKS cannot be parsed, the key is not found, or token validation (signature, issuer, audience, expiration) fails. """ # 1. Convert the JWKS JSON into a Tink public KeysetHandle. keyset_handle = jwt.jwk_set_to_public_keyset_handle(jwks_json) # 2. Instantiate the Tink JwtPublicKeyVerify primitive. jwt_verifier = keyset_handle.primitive(jwt.JwtPublicKeyVerify) # 3. Configure expected validation rules (issuer, audience, expiration). # Google Cloud STS sets 'typ': 'JWT' in the header, so # expected_type_header="JWT" is required. validator = jwt.new_validator( expected_issuer=expected_issuer, expected_audience=expected_audience, expected_type_header="JWT", allow_missing_expiration=False, ) # 4. Cryptographically verify the signature and standard OIDC claims. return jwt_verifier.verify_and_decode(token, validator)
Autorizar a identidade SPIFFE do agente
Depois de verificar a assinatura e as declarações padrão do token, inspecione a declaração sub (assunto) verificada para autorizar a solicitação e registrar o agente de chamada nos registros de auditoria.
A declaração sub contém o ID SPIFFE exclusivo do agente, por exemplo:
spiffe://agents.global.org-123456789012.system.id.goog/resources/aiplatform/projects/9876543210/locations/us-central1/reasoningEngines/my-test-agent
Na lógica de autorização do seu serviço, compare a declaração sub verificada com
uma lista de permissões de IDs SPIFFE de agentes confiáveis (ou prefixos de domínio de confiança) antes de
conceder acesso a recursos protegidos.
A seguir
- Resolver problemas de autenticação da identidade do agente
- Autenticar no Google Cloud usando a própria identidade de um agente
- Autenticar usando o OAuth de duas etapas com o gerenciador de autenticação
- Autenticar usando o OAuth de três etapas com o gerenciador de autenticação
- Autenticar usando uma chave de API com o gerenciador de autenticação
- Visão geral da identidade do agente