O acesso programático se refere à chamada de aplicativos protegidos pelo IAP de clientes que não são navegadores, como ferramentas de linha de comando, chamadas de serviço a serviço e aplicativos para dispositivos móveis. Dependendo do caso de uso, talvez você queira autenticar no IAP usando credenciais de usuário ou de serviço.
A conta de usuário pertence a um usuário individual. Ela é usada na autenticação quando o aplicativo precisa acessar recursos protegidos pelo IAP em nome de um usuário. Para mais informações, consulte Contas de usuário.
- Uma conta de serviço representa um aplicativo, não um usuário individual. Você autentica uma conta de serviço quando quer permitir que um aplicativo acesse seus recursos protegidos pelo IAP. Para mais informações, consulte Contas de serviço.
O IAP é compatível com os seguintes tipos de credenciais para acesso programático:
* Token de ID do OAuth 2.0: um token emitido pelo Google para um usuário humano ou uma conta de serviço com a declaração de público-alvo definida como o ID do recurso do aplicativo do IAP. * JWT assinado pela conta de serviço: um token JWT autoassinado ou emitido pelo Google para uma conta de serviço.Inclua essas credenciais no IAP no cabeçalho HTTP Authorization ou Proxy-Authorization da solicitação.
Antes de começar
Verifique se você tem um aplicativo que quer acessar de forma programática usando uma conta de desenvolvedor, uma conta de serviço ou credenciais de app para dispositivos móveis.
Para criar um ou mais clientes OAuth 2.0, consulte Acesso programático.
Autenticar uma conta de usuário
É possível permitir que o usuário acesse seu aplicativo em um computador ou dispositivo móvel para que um programa interaja com um recurso protegido pelo IAP.
Autenticar em um app para dispositivos móveis
- Crie ou use um ID do cliente OAuth 2.0 para seu app para dispositivos móveis. Para usar um ID do cliente OAuth 2.0, siga as etapas em Como compartilhar clientes OAuth. Adicione o ID do cliente OAuth à lista de permissões para acesso programático ao aplicativo.
- Consiga um token de ID para o ID do cliente OAuth 2.0 do
recurso protegido pelo IAP.
- Android: use a
API Login do Google
para solicitar um token do
OpenID Connect
(OIDC). Defina o
ID do cliente do
requestIdTokencomo o ID do cliente do recurso ao qual você está se conectando. - iOS: use o Login do Google para receber um token de ID.
- Android: use a
API Login do Google
para solicitar um token do
OpenID Connect
(OIDC). Defina o
ID do cliente do
- Inclua o token de ID em um cabeçalho
Authorization: Bearerpara fazer a solicitação autenticada ao recurso protegido pelo IAP.
Autenticar em um app para computador
Esta seção descreve como autenticar uma conta de usuário de uma linha de comando de um desktop.
- Para permitir que os desenvolvedores acessem seu aplicativo pela linha de comando, crie um ID do cliente OAuth 2.0 para computador ou compartilhe um ID do cliente OAuth para computador.
- Adicione o ID do OAuth à lista de permissões para acesso programático ao aplicativo.
Faça login no aplicativo.
Cada desenvolvedor precisa fazer login para acessar um app protegido pelo IAP. É possível empacotar o processo em um script, por exemplo, usando a CLI gcloud. O exemplo a seguir usa curl para fazer login e gerar um token que pode ser usado para acessar o aplicativo:
- Faça login na conta que tem acesso ao recurso do Google Cloud .
Inicie um servidor local que possa repetir as solicitações recebidas.
# Example using Netcat (http://netcat.sourceforge.net/) nc -k -l 4444Acesse o seguinte URI, em que
DESKTOP_CLIENT_IDé o ID do cliente do app para computador:https://accounts.google.com/o/oauth2/v2/auth?client_id=DESKTOP_CLIENT_ID&response_type=code&scope=openid%20email&access_type=offline&redirect_uri=http://localhost:4444&cred_ref=trueNa saída do servidor local, procure os parâmetros de solicitação:
GET /?code=CODE&scope=email%20openid%20https://www.googleapis.com/auth/userinfo.email&hd=google.com&prompt=consent HTTP/1.1Copie o valor de CODE para substituir CODE no comando a seguir, junto com o ID do cliente e a chave secreta do app para computador:
curl --verbose \ --data client_id=DESKTOP_CLIENT_ID \ --data client_secret=DESKTOP_CLIENT_SECRET \ --data code=CODE \ --data redirect_uri=http://localhost:4444 \ --data grant_type=authorization_code \ https://oauth2.googleapis.com/tokenEsse comando retorna um objeto JSON com um campo
id_tokenque pode ser usado para acessar o aplicativo.
Acessar o aplicativo
Para acessar o app, use o id_token:
curl --verbose --header 'Authorization: Bearer ID_TOKEN' URL
Token de atualização
Use o token de atualização gerado durante o fluxo de login para receber novos tokens de ID. Isso é útil quando o token de ID original expira. Cada token de ID é válido por cerca de uma hora, período em que é possível fazer várias solicitações para um app específico.
O exemplo a seguir usa curl para usar o token de atualização para receber um novo token de ID.
Neste exemplo, REFRESH_TOKEN é o token do fluxo de login.
DESKTOP_CLIENT_ID e DESKTOP_CLIENT_SECRET são os mesmos usados no
fluxo de login:
curl --verbose \
--data client_id=DESKTOP_CLIENT_ID \
--data client_secret=DESKTOP_CLIENT_SECRET \
--data refresh_token=REFRESH_TOKEN \
--data grant_type=refresh_token \
https://oauth2.googleapis.com/token
Esse comando retorna um objeto JSON com um novo campo id_token que
pode ser usado para acessar o app.
Autenticar uma conta de serviço
É possível usar um JWT de conta de serviço ou um token do OpenID Connect (OIDC) para autenticar uma conta de serviço com um recurso protegido pelo IAP. A tabela a seguir descreve algumas das diferenças entre os tokens de autenticação e os recursos deles.| Recursos do Authentication | JWT da conta de serviço | Token do OpenID Connect |
|---|---|---|
| Compatibilidade com o acesso baseado no contexto | ||
| Requisito de ID do cliente OAuth 2.0 | ||
| Escopo do token | URL do recurso protegido pelo IAP | ID do cliente OAuth 2.0 |
Autenticar com um JWT de conta de serviço
O IAP é compatível com a autenticação JWT de conta de serviço para identidades do Google, Identity Platform e aplicativos configurados com a federação de identidade de colaboradores.A autenticação de uma conta de serviço usando um JWT envolve as seguintes etapas:
Conceda à conta de serviço de chamada o papel de Criador de token da conta de serviço (
roles/iam.serviceAccountTokenCreator).O papel concede aos principais permissão para criar credenciais de curta duração, como JWTs.
Crie um JWT para o recurso protegido pelo IAP.
Assine o JWT usando a chave privada da conta de serviço.
Criar o JWT
O JWT criado precisa ter um payload semelhante ao seguinte exemplo:
{
"iss": SERVICE_ACCOUNT_EMAIL_ADDRESS,
"sub": SERVICE_ACCOUNT_EMAIL_ADDRESS,
"aud": TARGET_URL,
"iat": IAT,
"exp": EXP,
}
Nos campos
issesub, especifique o endereço de e-mail da conta de serviço. O endereço de e-mail está no campoclient_emaildo arquivo JSON da conta de serviço ou é fornecido como entrada. Formato típico:service-account@PROJECT_ID.iam.gserviceaccount.comNo campo
aud, especifique o URL exato ou o URL com um caractere curinga de caminho (/*) do recurso protegido pelo IAP, por exemplo,https://example.com/ouhttps://example.com/*. Um JWT com o URL exato no campoaudsó pode acessar esse URL específico. Um JWT com o caractere curinga de caminho (/*) no campoaudpode acessar todos os URLs que têm como prefixo a stringaudsem o*final.No campo
iat, especifique o horário atual da época Unix e, no campoexp, especifique um horário até 3.600 segundos depois. Define quando o JWT expira.
Assinar o JWT
Use um dos seguintes métodos para assinar o JWT:
- Use a API IAM Credentials para assinar um JWT sem precisar de acesso direto a uma chave privada.
- Use um arquivo de chave de credenciais local para assinar o JWT localmente.
Assinar o JWT usando a API Service Account Credentials do IAM
Use a API Service Account Credentials do IAM para assinar um JWT de conta de serviço. O método busca a chave privada associada à sua conta de serviço e a usa para assinar o payload do JWT. Isso permite a assinatura de um JWT sem acesso direto a uma chave privada.
Para autenticar no IAP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
gcloud
- Execute o comando a seguir para preparar uma solicitação com o payload JWT:
cat > claim.json << EOM
{
"iss": "SERVICE_ACCOUNT_EMAIL_ADDRESS",
"sub": "SERVICE_ACCOUNT_EMAIL_ADDRESS",
"aud": "TARGET_URL",
"iat": $(date +%s),
"exp": $((`date +%s` + 3600))
}
EOM
- Use o seguinte comando da Google Cloud CLI para assinar o payload em
claim.json:
gcloud iam service-accounts sign-jwt --iam-account="SERVICE_ACCOUNT_EMAIL_ADDRESS" claim.json output.jwt
Após uma solicitação bem-sucedida, output.jwt contém um JWT assinado que pode ser usado para acessar o recurso protegido pelo IAP.
Python
import datetime
import json
import google.auth
from google.cloud import iam_credentials_v1
def generate_jwt_payload(service_account_email: str, resource_url: str) -> str:
"""Generates JWT payload for service account.
Creates a properly formatted JWT payload with standard claims (iss, sub,
aud, iat, exp) needed for IAP authentication.
Args:
service_account_email (str): Specifies the service account that the
JWT is created for.
resource_url (str): Specifies the scope of the JWT, the URL that the
JWT will be allowed to access.
Returns:
str: JSON string containing the JWT payload with properly formatted
claims.
"""
# Create current time and expiration time (1 hour later) in UTC
iat = datetime.datetime.now(tz=datetime.timezone.utc)
exp = iat + datetime.timedelta(seconds=3600)
# Convert datetime objects to numeric timestamps (seconds since epoch)
# as required by JWT standard (RFC 7519)
payload = {
"iss": service_account_email,
"sub": service_account_email,
"aud": resource_url,
"iat": int(iat.timestamp()),
"exp": int(exp.timestamp()),
}
return json.dumps(payload)
def sign_jwt(target_sa: str, resource_url: str) -> str:
"""Signs JWT payload using ADC and IAM credentials API.
Uses Google Cloud's IAM Credentials API to sign a JWT. This requires the
caller to have iap.webServiceVersions.accessViaIap permission on the
target service account.
Args:
target_sa (str): Service Account JWT is being created for.
iap.webServiceVersions.accessViaIap permission is required.
resource_url (str): Audience of the JWT and scope of the JWT token.
This is the URL of the IAP-secured application.
Returns:
str: A signed JWT that can be used to access IAP-secured applications.
Use in Authorization header as: 'Bearer <signed_jwt>'
"""
# Get default credentials from environment or application credentials
source_credentials, project_id = google.auth.default()
# Initialize IAM credentials client with source credentials
iam_client = iam_credentials_v1.IAMCredentialsClient(credentials=source_credentials)
# Generate the service account resource name.
# Project should always be "-".
# Replacing the wildcard character with a project ID is invalid.
name = iam_client.service_account_path("-", target_sa)
# Create and sign the JWT payload
payload = generate_jwt_payload(target_sa, resource_url)
# Sign the JWT using the IAM credentials API
response = iam_client.sign_jwt(name=name, payload=payload)
return response.signed_jwt
curl
Execute o comando a seguir para preparar uma solicitação com o payload JWT:
cat << EOF > request.json { "payload": JWT_PAYLOAD } EOFAssinar o JWT usando o IAM
API Service Account Credentials:
curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL_ADDRESS:signJwt"Após uma solicitação bem-sucedida, um JWT assinado é retornado na resposta.
Use o JWT para acessar o recurso protegido pelo IAP.
Assinar o JWT de um arquivo de chave de credencial local
Os JWTs são assinados usando a chave privada da conta de serviço.
Se você tiver um arquivo de chave de conta de serviço, o JWT poderá ser assinado localmente.
Ao assinar o JWT localmente, inclua um cabeçalho JWT com o payload. No
campo kid no cabeçalho, use o ID da chave privada da conta de serviço, que
está no campo private_key_id do arquivo JSON de credencial da conta de serviço.
A chave privada do arquivo é usada para assinar o JWT.
Acessar o aplicativo
Para acessar o aplicativo, inclua o JWT assinado no cabeçalho de autorização:
curl --verbose --header 'Authorization: Bearer SIGNED_JWT' URL
Autenticar com um token OIDC de conta de serviço
Para autenticar com um token OIDC de conta de serviço, faça o seguinte:
Crie um novo ID do cliente OIDC ou use um que já existe.
Para criar um novo ID do cliente OAuth 2.0, faça o seguinte:
Registre seu aplicativo para usar o Google Auth, se ainda não tiver feito isso.
Acesse a página da Google Auth Platform.
Acessar a Google Auth Platform
Se você não tiver um projeto selecionado, será solicitado que crie um.
Clique em Criar cliente.
Selecione o tipo de aplicativo adequado e insira as informações adicionais necessárias.
Preencha as informações necessárias para o tipo de cliente selecionado. Para criar o cliente, clique em Criar.
Para usar um ID do cliente OAuth 2.0: siga as etapas em Como compartilhar clientes OAuth.
Adicione o ID do OAuth à lista de permissões para acesso programático ao aplicativo.
Verifique se a conta de serviço padrão foi adicionada à lista de acesso do projeto protegido pelo IAP.
Ao fazer solicitações ao recurso protegido pelo IAP, inclua o token no cabeçalho Authorization: Authorization: 'Bearer OIDC_TOKEN'
Os exemplos de código a seguir demonstram como receber um token OIDC.
Receber um token OIDC para a conta de serviço padrão
Para receber um token OIDC para a conta de serviço padrão do Compute Engine, do App Engine ou do Cloud Run, consulte o seguinte exemplo de código para gerar um token para acessar um recurso protegido pelo IAP:
C#
Para autenticar no IAP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Go
Para autenticar no IAP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Java
Para autenticar no IAP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Node.js
Para autenticar no IAP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
PHP
Para autenticar no IAP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Python
Para autenticar no IAP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Ruby
Para autenticar no IAP, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Receber um token OIDC de um arquivo de chave da conta de serviço local
Para gerar um token OIDC usando um arquivo de chave de conta de serviço, crie e assine uma declaração JWT usando o arquivo de chave e troque essa declaração por um token de ID. O script Bash a seguir demonstra esse processo:
Bash
#!/usr/bin/env bash
#
# Example script that generates an OIDC token using a service account key file and uses it to access an IAP-secured resource.
set -euo pipefail
get_token() {
# Get the bearer token in exchange for the service account credentials
local service_account_key_file_path="${1}"
local iap_client_id="${2}"
# Define the scope and token endpoint
local iam_scope="https://www.googleapis.com/auth/iam"
local oauth_token_uri="https://www.googleapis.com/oauth2/v4/token"
# Extract data from service account key file
local private_key_id="$(cat "${service_account_key_file_path}" | jq -r '.private_key_id')"
local client_email="$(cat "${service_account_key_file_path}" | jq -r '.client_email')"
local private_key="$(cat "${service_account_key_file_path}" | jq -r '.private_key')"
# Set token timestamps (current time and expiration 10 minutes later)
local issued_at="$(date +%s)"
local expires_at="$((issued_at + 600))"
# Create JWT header and payload
local header="{'alg':'RS256','typ':'JWT','kid':'${private_key_id}'}"
local header_base64="$(echo "${header}" | base64 | tr -d '\n')"
local payload="{'iss':'${client_email}','aud':'${oauth_token_uri}','exp':${expires_at},'iat':${issued_at},'sub':'${client_email}','target_audience':'${iap_client_id}'}"
local payload_base64="$(echo "${payload}" | base64 | tr -d '\n')"
# Create JWT signature using the private key
local signature_base64="$(printf %s "${header_base64}.${payload_base64}" | openssl dgst -binary -sha256 -sign <(printf '%s\n' "${private_key}") | base64 | tr -d '\n')"
local assertion="${header_base64}.${payload_base64}.${signature_base64}"
# Exchange the signed JWT assertion for an ID token
local token_payload="$(curl -s \
--data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
--data-urlencode "assertion=${assertion}" \
https://www.googleapis.com/oauth2/v4/token)"
# Extract just the ID token from the response
local bearer_id_token="$(echo "${token_payload}" | jq -r '.id_token')"
echo "${bearer_id_token}"
}
main() {
# Check if required arguments are provided
if [[ $# -lt 3 ]]; then
echo "Usage: $0 <service_account_key_file.json> <iap_client_id> <url>"
exit 1
fi
# Assign parameters to variables
SERVICE_ACCOUNT_KEY="$1"
IAP_CLIENT_ID="$2"
URL="$3"
# Generate the ID token
echo "Generating token..."
ID_TOKEN=$(get_token "${SERVICE_ACCOUNT_KEY}" "${IAP_CLIENT_ID}")
# Access the IAP-secured resource with the token
echo "Accessing: ${URL}"
curl --header "Authorization: Bearer ${ID_TOKEN}" "${URL}"
}
# Run the main function with all provided arguments
main "$@"
Esse script executa as seguintes etapas:
- Extrai as informações da chave da conta de serviço do arquivo de chave JSON.
- Cria um JWT com os campos necessários, incluindo o ID do cliente do IAP como público-alvo.
- Assina o JWT usando a chave privada da conta de serviço.
- Troca esse JWT por um token OIDC usando o serviço OAuth do Google.
- Usa o token resultante para fazer uma solicitação autenticada ao recurso protegido pelo IAP.
Para usar este script:
- Salve-o em um arquivo, por exemplo:
get_iap_token.sh - Torne-o executável:
chmod +x get_iap_token.sh - Execute-o com três parâmetros:
./get_iap_token.sh service-account-key.json \
OAUTH_CLIENT_ID \
URL
Em que:
service-account-key.jsoné o arquivo de chave da conta de serviço que você salvou.- OAUTH_CLIENT_ID é o ID do cliente OAuth do recurso protegido pelo IAP.
- URL é o URL que você quer acessar.
Receber um token do OIDC usando a identidade temporária de conta de serviço
Em todos os outros casos, use a API IAM Credentials para gerar um token OIDC personificando uma conta de serviço de destino logo antes de acessar um recurso protegido pelo IAP. Esse processo envolve as seguintes etapas:
Forneça à conta de serviço de chamada (a conta de serviço associada ao código que está recebendo o token de ID) o papel de Criador de token de identidade do OpenID Connect da conta de serviço (
roles/iam.serviceAccountOpenIdTokenCreator).Isso permite que a conta de serviço de chamada represente a conta de serviço de destino.
Use as credenciais fornecidas pela conta de serviço de chamada para chamar o método generateIdToken na conta de serviço de destino.
Defina o campo
audiencecomo o ID do cliente.
Para instruções detalhadas, consulte Criar um token de ID.
Autenticar pelo cabeçalho Proxy-Authorization
Se o aplicativo usar o cabeçalho da solicitação Authorization, será possível incluir o
token de ID em um cabeçalho Proxy-Authorization: Bearer. Se um token de ID válido
for encontrado em um cabeçalho Proxy-Authorization, o IAP vai autorizar
a solicitação com ele. Depois de autorizar a solicitação, o IAP
transmite o cabeçalho Authorization para o aplicativo sem processar o
conteúdo.
Se nenhum token de ID válido for encontrado no cabeçalho Proxy-Authorization,
o IAP continuará processando o cabeçalho Authorization e
removerá o cabeçalho Proxy-Authorization antes de transmitir a solicitação para o
aplicativo.
Acessar o aplicativo
Para acessar o aplicativo usando o cabeçalho Proxy-Authorization, execute o seguinte comando:
curl --verbose --header 'Proxy-Authorization: Bearer SIGNED_JWT' URL
A seguir
- Saiba mais sobre Autorização: tokens do portador.
- Teste o Login para Android ou o Login para iOS.