En esta página, se describe cómo autenticar una cuenta de usuario o una cuenta de servicio con un recurso seguro de Identity-Aware Proxy (IAP).
El acceso programático es la situación en la que llamas a aplicaciones protegidas por IAP desde clientes que no son de navegador. Esto incluye herramientas de línea de comandos, llamadas de servicio a servicio y aplicaciones para dispositivos móviles. Según tu caso de uso, es posible que desees autenticarte en IAP con credenciales de usuario o credenciales de servicio.
Una cuenta de usuario pertenece a un usuario individual. Debes autenticarla cuando tu aplicación requiera acceso a recursos protegidos con IAP en nombre de un usuario. Para obtener más información, consulta Cuentas de usuario.
Una cuenta de servicio representa una aplicación en lugar de un usuario individual. Debes autenticarla cuando desees permitir que una aplicación acceda a tus recursos protegidos con IAP. Para obtener más información, consulta Cuentas de servicio.
IAP admite los siguientes tipos de credenciales para el acceso programático:
- Token de ID de OAuth 2.0: Es un token emitido por Google para un usuario humano o una cuenta de servicio con la declaración de público establecida en el ID de recurso de la aplicación de la IAP.
- JWT firmado por la cuenta de servicio: Es un token JWT autofirmado o emitido por Google para una cuenta de servicio.
Pasa estas credenciales al IAP en el encabezado HTTP Authorization
o Proxy-Authorization
.
Antes de comenzar
Antes de comenzar, necesitarás una aplicación protegida con IAP a la que deseas conectarte de manera programática con una cuenta de desarrollador, una cuenta de servicio o credenciales de aplicación para dispositivos móviles.
Autentica una cuenta de usuario
Puedes habilitar el acceso de los usuarios a tu aplicación desde un escritorio o una aplicación para dispositivos móviles a fin de permitir que un programa interactúe con un recurso protegido por IAP.
Realiza la autenticación desde una app para dispositivos móviles
- Crea o usa un ID de cliente de OAuth 2.0 existente para tu app para dispositivos móviles. Para usar un ID de cliente de OAuth 2.0 existente, sigue los pasos que se indican en Cómo compartir clientes de OAuth. Agrega el ID de cliente de OAuth a la lista de entidades permitidas para el acceso programático de la aplicación.
- Obtén un token de ID para el ID de cliente protegido con IAP.
- Android: Usa la API de Acceso con Google para solicitar un token de OpenID Connect (OIDC). Establece el ID de cliente
requestIdToken
en el ID de cliente del recurso al que te estás conectando. - iOS: Usa el Acceso con Google para obtener un token de ID.
- Android: Usa la API de Acceso con Google para solicitar un token de OpenID Connect (OIDC). Establece el ID de cliente
- Incluye el token de ID en un encabezado
Authorization: Bearer
para realizar la solicitud autenticada al recurso protegido con IAP.
Autenticación desde una app para computadoras
En esta sección se describe cómo autenticar una cuenta de usuario desde una línea de comandos de escritorio.
- Para permitir que los desarrolladores accedan a tu aplicación desde la línea de comandos, crea un ID de cliente de OAuth 2.0 para computadoras o comparte un ID de cliente de OAuth para computadoras existente.
- Agrega el ID de OAuth a la lista de entidades permitidas para el acceso programático de la aplicación.
Accede a la aplicación
Todos los desarrolladores que quieran acceder a una aplicación protegida con IAP deberán primero acceder. Puedes empaquetar el proceso en una secuencia de comandos, por ejemplo, mediante gcloud CLI. En el siguiente ejemplo, se usa curl para acceder y generar un token que se puede usar a fin de acceder a la aplicación:
- Accede a la cuenta que tiene acceso al recurso Google Cloud .
Inicia un servidor local que pueda repetir las solicitudes entrantes.
# Example using Netcat (http://netcat.sourceforge.net/) nc -k -l 4444
Ve al siguiente URI, en el que
DESKTOP_CLIENT_ID
es el ID de cliente de la app de escritorio: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=true
En el resultado del servidor local, busca los parámetros de solicitud:
GET /?code=CODE&scope=email%20openid%20https://www.googleapis.com/auth/userinfo.email&hd=google.com&prompt=consent HTTP/1.1
Copia el valor de CODE para reemplazar
AUTH_CODE
en el siguiente comando, junto con el ID de cliente y el secreto de la app de escritorio: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/token
Este comando muestra un objeto JSON con un campo
id_token
que puedes usar para acceder a la aplicación.
Accede a la aplicación
Para acceder a la app, usa el id_token
:
curl --verbose --header 'Authorization: Bearer ID_TOKEN' URL
Token de actualización
Puedes usar el token de actualización generado durante el flujo de acceso para obtener tokens de ID nuevos. Esto es útil cuando vence el token de ID original. Cada token de ID es válido durante aproximadamente una hora, durante la cual puedes realizar varias solicitudes a una app específica.
En el siguiente ejemplo, se usa curl para usar el token de actualización y obtener un token de ID nuevo.
En este ejemplo, REFRESH_TOKEN
es el token del flujo de acceso.
DESKTOP_CLIENT_ID
y DESKTOP_CLIENT_SECRET
son los mismos
que se usan en el flujo de acceso:
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
Este comando muestra un objeto JSON con un nuevo campo id_token
que puedes usar para acceder a la app.
Cómo autenticar una cuenta de servicio
Puedes usar un JWT de cuenta de servicio o un token de OpenID Connect (OIDC) para autenticar una cuenta de servicio con un recurso protegido por IAP. En la siguiente tabla, se describen algunas de las diferencias entre los diferentes tokens de autenticación y sus funciones.
Funciones de Authentication | JWT de la cuenta de servicio | Token de OpenID Connect |
---|---|---|
Compatibilidad con el acceso adaptado al contexto | ||
Requisito de ID de cliente de OAuth 2.0 | ||
Alcance del token | URL del recurso protegido con IAP | ID de cliente de OAuth 2.0 |
Cómo autenticar con un JWT de una cuenta de servicio
IAP admite la autenticación de JWT de la cuenta de servicio para las identidades de Google, Identity Platform y las aplicaciones configuradas de la federación de identidades de personal.
La autenticación de una cuenta de servicio con un JWT incluye los siguientes pasos principales:
Otorga a la cuenta de servicio que realiza la llamada el rol de creador de tokens de cuenta de servicio (
roles/iam.serviceAccountTokenCreator
).El rol les otorga a las principales permiso para crear credenciales de corta duración, como los JWT.
Crea un JWT para el recurso protegido por IAP.
Firma el JWT con la clave privada de la cuenta de servicio.
Crea el JWT
El JWT creado debe tener una carga útil similar al siguiente ejemplo:
{
"iss": SERVICE_ACCOUNT_EMAIL_ADDRESS,
"sub": SERVICE_ACCOUNT_EMAIL_ADDRESS,
"aud": TARGET_URL,
"iat": IAT,
"exp": EXP,
}
En los campos
iss
ysub
, especifica la dirección de correo electrónico de la cuenta de servicio. Se encuentra en el campoclient_email
del archivo JSON de la cuenta de servicio o se pasa. Formato típico:service-account@PROJECT_ID.iam.gserviceaccount.com
En el campo
aud
, especifica la URL del recurso protegido por la IAP.Para el campo
iat
, especifica la hora de época actual de Unix y, para el campoexp
, especifica una hora dentro de 3,600 segundos después. Esto define cuándo vence el JWT.
Firma del JWT
Puedes usar uno de los siguientes métodos para firmar el JWT:
- Usa la API de credenciales de IAM para firmar un JWT sin requerir acceso directo a una clave privada.
- Usa un archivo de claves de credenciales local para firmar el JWT de forma local.
Firma el JWT con la API de credenciales de la cuenta de servicio de IAM
Usa la API de credenciales de la cuenta de servicio de IAM para firmar un JWT de cuenta de servicio. El método recupera la clave privada asociada con tu cuenta de servicio y la usa para firmar la carga útil de JWT. Esto permite firmar un JWT sin acceso directo a una clave privada.
Para autenticarte en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
gcloud
- Ejecuta el siguiente comando para preparar una solicitud con la carga útil de 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
- Usa el siguiente comando de Google Cloud CLI para firmar la carga útil en
claim.json
:
gcloud iam service-accounts sign-jwt --iam-account="SERVICE_ACCOUNT_EMAIL_ADDRESS" claim.json output.jwt
Después de una solicitud correcta, output.jwt
contiene un JWT firmado que puedes usar para acceder a tu recurso protegido por 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 service account JWT is created for.
resource_url (str): Specifies 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 protected application.
Returns:
str: A signed JWT that can be used to access IAP protected apps.
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
# If project_id is None, use '-' as placeholder as per API requirements
project = project_id if project_id else "-"
name = iam_client.service_account_path(project, 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
Ejecuta el siguiente comando para preparar una solicitud con la carga útil del JWT:
cat << EOF > request.json { "payload": JWT_PAYLOAD } EOF
Firma el JWT con IAM
API de 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"
Después de una solicitud correcta, se muestra un JWT firmado en la respuesta.
Usa el JWT para acceder a tu recurso protegido por IAP.
Firma el JWT desde un archivo de claves de credenciales local
Los JWT se firman con la clave privada de la cuenta de servicio.
Si tienes un archivo de claves de cuenta de servicio, el JWT se puede firmar de forma local.
La secuencia de comandos envía un encabezado JWT junto con la carga útil. Para el campo kid
del encabezado, usa el ID de clave privada de la cuenta de servicio, que se encuentra en el campo private_key_id
del archivo JSON de credenciales de la cuenta de servicio.
La clave también se usa para firmar el JWT.
Accede a la aplicación
En todos los casos, para acceder a la app, usa signed-jwt
:
curl --verbose --header 'Authorization: Bearer SIGNED_JWT' URL
Cómo autenticar con un token de OIDC
- Crea o usa un ID de cliente de OAuth 2.0 existente. Para usar un ID de cliente de OAuth 2.0 existente, sigue los pasos que se indican en Cómo compartir clientes de OAuth.
- Agrega el ID de OAuth a la lista de entidades permitidas para el acceso programático de la aplicación.
- Asegúrate de que la cuenta de servicio predeterminada se agregue a la lista de acceso del proyecto protegido con IAP.
Cuando realices solicitudes al recurso protegido con IAP, debes incluir el token en el encabezado Authorization
: Authorization: 'Bearer OIDC_TOKEN'
En las siguientes muestras de código, se muestra cómo obtener un token de OIDC.
Cómo obtener un token de OIDC para la cuenta de servicio predeterminada
Para obtener un token de OIDC para la cuenta de servicio predeterminada de Compute Engine, App Engine o Cloud Run, consulta el siguiente muestra de código para generar un token que te permita acceder a un recurso protegido con IAP:
C#
Para autenticarte en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Go
Para autenticarte en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Java
Para autenticarte en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Node.js
Para autenticarte en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
PHP
Para autenticarte en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Python
Para autenticarte en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Ruby
Para autenticarte en IAP, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Cómo obtener un token de OIDC desde un archivo de claves de cuenta de servicio local
Para generar un token de OIDC con un archivo de claves de cuenta de servicio, usarás el archivo de claves para crear y firmar una aserción JWT y, luego, intercambiar esa aserción por un token de ID. En la siguiente secuencia de comandos de Bash, se muestra este proceso:
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 "$@"
Esta secuencia de comandos realiza los siguientes pasos:
- Extrae la información de la clave de la cuenta de servicio de tu archivo de claves JSON.
- Crea un JWT con los campos necesarios, incluido el ID de cliente de IAP como público objetivo.
- Firma el JWT con la clave privada de la cuenta de servicio
- Intercambia este JWT por un token de OIDC a través del servicio de OAuth de Google.
- Usa el token resultante para realizar una solicitud autenticada a tu recurso protegido con IAP.
Para usar esta secuencia de comandos, sigue estos pasos:
- Guárdalo en un archivo, por ejemplo:
get_iap_token.sh
- Haz que sea ejecutable:
chmod +x get_iap_token.sh
- Ejecuta el comando con tres parámetros:
./get_iap_token.sh service-account-key.json \
OAUTH_CLIENT_ID \
URL
Aquí:
service-account-key.json
es el archivo de claves de la cuenta de servicio que descargaste.- OAUTH_CLIENT_ID es el ID de cliente de OAuth de tu recurso protegido por IAP.
- URL es la URL a la que deseas acceder.
Cómo obtener un token de OIDC en todos los demás casos
En todos los demás casos, usa la API de credenciales de IAM paragenerar un token de OIDC mediante la simulación de identidad de una cuenta de servicio objetivo justo antes de acceder a un recurso protegido con IAP. Este proceso implica los siguientes pasos:
Proporciona a la cuenta de servicio que realiza la llamada (la cuenta de servicio asociada con el código que obtiene el token de ID) el rol de creador de tokens de identidad de OpenID Connect para cuentas de servicio (
roles/iam.serviceAccountOpenIdTokenCreator
).Esto le permite a la cuenta de servicio que realiza la llamada suplantar la identidad de la cuenta de servicio objetivo.
Usa las credenciales que proporciona la cuenta de servicio que realiza la llamada para invocar el método generateIdToken en la cuenta de servicio de destino.
Establece el campo
audience
en tu ID de cliente.
Para obtener instrucciones paso a paso, consulta Crea un token de ID.
Cómo autenticar desde el encabezado de autorización de proxy
Si tu aplicación usa el encabezado de solicitud Authorization
, puedes incluir el
token de ID en un encabezado Proxy-Authorization: Bearer
. Si se encuentra un token de ID válido en un encabezado Proxy-Authorization
, IAP autoriza la solicitud con él. Después de autorizar la solicitud, el IAP pasa el encabezado Authorization
a tu aplicación sin procesar el contenido.
Si no se encuentra un token de ID válido en el encabezado Proxy-Authorization
, la IAP continúa procesando el encabezado Authorization
y quita el encabezado Proxy-Authorization
antes de pasar la solicitud a tu aplicación.
¿Qué sigue?
- Obtén más información sobre los tokens del portador para la autorización.
- Intenta acceder a Android o acceder a iOS.