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).
- 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. Obtén información sobre las credenciales de cuentas de usuario.
- Una cuenta de servicio pertenece a una aplicación y no a un usuario individual. Debes autenticarla cuando desees permitir que una aplicación acceda a tus recursos protegidos con IAP. Obtén más Información sobre las cuentas de servicio.
Antes de comenzar
Necesitarás lo siguiente antes de comenzar:
- 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 permitir que los usuarios accedan a tu aplicación, desde una app para dispositivos móviles o de escritorio, de tal forma que el programa interactúe con un recurso protegido con IAP.
Autenticación desde una aplicación para dispositivos móviles
- Crea un ID de cliente de OAuth 2.0 para tu aplicación para dispositivos móviles en el mismo proyecto que el recurso protegido con IAP:
- Ve a la página Credenciales.
Ir a la página Credenciales - Selecciona el proyecto con el recurso protegido con IAP.
- Haz clic en Crear credenciales y, luego, selecciona ID de cliente de OAuth.
- Selecciona el tipo de aplicación para la que quieres crear credenciales.
- Agrega un Nombre y Restricciones si corresponden y, luego, haz clic en Crear.
- Ve a la página Credenciales.
- En la ventana Cliente de OAuth que aparece, toma nota del ID de cliente del recurso protegido con IAP al que deseas conectarte.
- 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. Configura
serverClientID
con el ID de cliente del recurso al que te estás conectando.
- 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
a fin de realizar la solicitud autenticada para el recurso protegido con IAP.
Autenticación desde una aplicación de escritorio
En esta sección se describe cómo autenticar una cuenta de usuario desde una línea de comandos de escritorio.
Configuración del ID de cliente
Para permitir que los desarrolladores accedan a tu aplicación desde la línea de comandos, primero deberás crear credenciales para el ID de cliente de OAuth del tipo app de escritorio:
- Ve a la página Credenciales.
Ir a la página Credenciales - Selecciona el proyecto con el recurso protegido con IAP.
- Haz clic en Crear credenciales y selecciona ID de cliente de OAuth.
- En Tipo de aplicación, selecciona App de escritorio, agrega un Nombre y, a continuación, haz clic en Crear.
- En la ventana del cliente OAuth que aparece a continuación, toma nota del ID de cliente y del secreto del cliente. Los necesitarás en una secuencia de comandos para poder administrar las credenciales o compartirlos con los desarrolladores.
- En la ventana Credenciales, podrás ver tus nuevas credenciales de App de escritorio junto con el ID de cliente principal que se utiliza para acceder a tu aplicación.
Accede a la aplicación
Todos los desarrolladores que quieran tener acceso 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. A continuación se muestra un ejemplo del uso de curl para ingresar 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 de Google Cloud.
-
Inicia un servidor local que pueda hacer eco de las solicitudes entrantes.
$ nc -k -l 4444
NOTA: El comando usa la utilidad NetCat. Puedes usar la utilidad que desees. -
Ve al siguiente URI, en el que
DESKTOP_CLIENT_ID
es el ID de cliente de la app de escritorio que creaste antes: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 la solicitud. Deberías ver algo similar a lo siguiente:
GET /?code=$CODE&scope=email%20openid%20https://www.googleapis.com/auth/userinfo.email&hd=google.com&prompt=consent HTTP/1.1
Copia el CODE para reemplazarAUTH_CODE
a continuación junto con el ID de cliente de la app de escritorio y el secreto que creaste anteriormente.IAP_CLIENT_ID
es el ID de cliente principal que se usa para acceder a tu aplicación:curl --verbose \ --data client_id=DESKTOP_CLIENT_ID \ --data client_secret=DESKTOP_CLIENT_SECRET \ --data code=AUTH_CODE \ --data audience=IAP_CLIENT_ID \ --data redirect_uri=http://localhost:4444 \ --data grant_type=authorization_code \ https://oauth2.googleapis.com/token
Este código 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 aplicación, usa el objeto id_token
de la siguiente manera:
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 resulta útil cuando vence el token de ID original. Cada token de ID es válido por alrededor de una hora, durante la cual puedes realizar varias solicitudes a una app específica.
El siguiente es un ejemplo que usa curl para usar el token de actualización a fin de obtener un token de ID nuevo. En el siguiente ejemplo, REFRESH_TOKEN
es el token del flujo de acceso.
IAP_CLIENT_ID
, 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 \ --data audience=IAP_CLIENT_ID \ https://oauth2.googleapis.com/token
Este código muestra un objeto JSON con un nuevo campo id_token
que puedes usar para acceder a la aplicación.
Autenticación desde una cuenta de servicio
Usa un token de OpenID Connect (OIDC) para autenticar una cuenta de servicio en un recurso protegido con IAP. Sigue estos pasos para encontrar tu ID de cliente:
- Ve a la página de IAP.
Busca el recurso al que deseas acceder y, luego, haz clic en > Ir a Configuración de OAuth.
En la página que aparece, toma nota del ID de cliente.
También debes agregar la cuenta de servicio a la lista de acceso del proyecto protegido con IAP. En las siguientes muestras de código, se indica cómo obtener un token de OIDC. No importa cuál elijas, debes incluir el token en un encabezado Authorization: Bearer
para realizar la solicitud autenticada al recurso protegido con IAP.
Obtén un token OIDC para la cuenta de servicio predeterminada
Si deseas obtener un token de OIDC para la cuenta de servicio predeterminada de Compute Engine, App Engine o Cloud Run, puedes usar el siguiente código de muestra a fin de generar el token para acceder a un recurso protegido con IAP:
C#
Go
Java
Node.js
PHP
Python
Ruby
Obtén un token OIDC de un archivo de claves de cuenta de servicio local
Si tienes un archivo de claves de cuenta de servicio, puedes adaptar las muestras de código anteriores para proporcionar el archivo de claves de cuenta de servicio.
Bash
#!/usr/bin/env bash
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}"
local iam_scope="https://www.googleapis.com/auth/iam"
local oauth_token_uri="https://www.googleapis.com/oauth2/v4/token"
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')"
local issued_at="$(date +%s)"
local expires_at="$((issued_at + 3600))"
local header="{'alg':'RS256','typ':'JWT','kid':'${private_key_id}'}"
local header_base64="$(echo "${header}" | base64)"
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)"
local signature_base64="$(printf %s "${header_base64}.${payload_base64}" | openssl dgst -binary -sha256 -sign <(printf '%s\n' "${private_key}") | base64)"
local assertion="${header_base64}.${payload_base64}.${signature_base64}"
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)"
local bearer_id_token="$(echo "${token_payload}" | jq -r '.id_token')"
echo "${bearer_id_token}"
}
main(){
# TODO: Replace the following variables:
SERVICE_ACCOUNT_KEY="service_account_key_file_path"
IAP_CLIENT_ID="iap_client_id"
URL="application_url"
# Obtain the Bearer ID token.
ID_TOKEN=$(get_token "${SERVICE_ACCOUNT_KEY}" "${IAP_CLIENT_ID}")
# Access the application with the Bearer ID token.
curl --header "Authorization: Bearer ${ID_TOKEN}" "${URL}"
}
main "$@"
Obtén un token 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 basado en un token de acceso para otra cuenta de servicio justo antes de acceder a un recurso protegido con IAP:
- Agrega la cuenta en el token de acceso con la función
service account token creator
a la cuenta de destino. Esto garantiza que tenga el permiso de IAM requerido a fin de crear un token de OIDC para la cuenta de servicio de destino. - Llama a generateIdToken en la cuenta de servicio de destino con el token de acceso.
Presta especial atención para establecer el campo
audience
en tu ID de cliente.
Autentica desde el encabezado de autorización proxy
Si tu aplicación ocupa el encabezado de la 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, 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
, 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 el token del portador de autorización.
- Intenta acceder a Android o acceder a iOS.