Autenticar con JWTs
La API de BigQuery acepta tokens web JSON (JWTs) para autenticar solicitudes.
Como práctica recomendada, debes usar credenciales de aplicación predeterminadas (ADC) para autenticarte en BigQuery. Si no puedes usar ADC y utilizas una cuenta de servicio para la autenticación, puedes usar un JWT firmado. Los JWTs te permiten hacer una llamada a una API sin enviar una solicitud de red al servidor de autorización de Google.
Puedes usar JWTs para autenticarte de las siguientes formas:
- En el caso de las claves de cuenta de servicio creadas en la consola de Google Cloud o con la CLI de gcloud, usa una biblioteca de cliente que proporcione firma JWT.
- En el caso de las cuentas de servicio gestionadas por el sistema, utiliza la API REST o la CLI de gcloud.
Ámbito y audiencia
Usa permisos con cuentas de servicio siempre que sea posible. Si no es posible, puedes usar una reclamación de audiencia.
En las APIs de BigQuery, asigna el valor https://bigquery.googleapis.com/
al parámetro audience.
Crear JWTs con bibliotecas de cliente
Para las claves de cuenta de servicio creadas en la consola de Google Cloud o con la CLI de gcloud, usa una biblioteca de cliente que proporcione la firma JWT. En la siguiente lista se ofrecen algunas opciones adecuadas para lenguajes de programación populares:
- Go: func JWTAccessTokenSourceFromJSON
- Java: clase ServiceAccountCredentials
- Node.js: Clase JWTAccess
- PHP: ServiceAccountJwtAccessCredentials
- Python: módulo google.auth.jwt
- Ruby: Clase: Google::Auth::ServiceAccountJwtHeaderCredentials
Ejemplo de Java
En el siguiente ejemplo se usa la biblioteca de cliente de BigQuery para Java para crear y firmar un JWT. El ámbito predeterminado de la API de BigQuery se define como https://www.googleapis.com/auth/bigquery
en la biblioteca de cliente.
import com.google.auth.oauth2.ServiceAccountCredentials;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.common.collect.ImmutableList;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
public class Example {
public static void main(String... args) throws IOException {
String projectId = "myproject";
// Load JSON file that contains service account keys and create ServiceAccountCredentials object.
String credentialsPath = "/path/to/key.json";
ServiceAccountCredentials credentials = null;
try (FileInputStream is = new FileInputStream(credentialsPath)) {
credentials = ServiceAccountCredentials.fromStream(is);
// The default scope for BigQuery is used.
// Alternatively, use `.setScopes()` to set custom scopes.
credentials = credentials.toBuilder()
.setUseJwtAccessWithScope(true)
.build();
}
// Instantiate BigQuery client with the credentials object.
BigQuery bigquery =
BigQueryOptions.newBuilder().setCredentials(credentials).build().getService();
// Use the client to list BigQuery datasets.
System.out.println("Datasets:");
bigquery
.listDatasets(projectId)
.iterateAll()
.forEach(dataset -> System.out.printf("%s%n", dataset.getDatasetId().getDataset()));
}
}
Crear JWTs con REST o la CLI de gcloud
En el caso de las cuentas de servicio gestionadas por el sistema, debes ensamblar manualmente el JWT y, a continuación, usar el método REST projects.serviceAccounts.signJwt
o el comando de la CLI de Google Cloud gcloud beta iam service-accounts sign-jwt
para firmar el JWT. Para usar cualquiera de estos métodos, debes tener el rol de gestión de identidades y accesos Creador de tokens de cuenta de servicio.
Ejemplo de la CLI de gcloud
En el siguiente ejemplo se muestra una secuencia de comandos de bash que ensambla un JWT y, a continuación, usa el comando gcloud beta iam service-accounts sign-jwt
para firmarlo.
#!/bin/bash
SA_EMAIL_ADDRESS="myserviceaccount@myproject.iam.gserviceaccount.com"
TMP_DIR=$(mktemp -d /tmp/sa_signed_jwt.XXXXX)
trap "rm -rf ${TMP_DIR}" EXIT
JWT_FILE="${TMP_DIR}/jwt-claim-set.json"
SIGNED_JWT_FILE="${TMP_DIR}/output.jwt"
IAT=$(date '+%s')
EXP=$((IAT+3600))
cat <<EOF > $JWT_FILE
{
"aud": "https://bigquery.googleapis.com/",
"iat": $IAT,
"exp": $EXP,
"iss": "$SA_EMAIL_ADDRESS",
"sub": "$SA_EMAIL_ADDRESS"
}
EOF
gcloud beta iam service-accounts sign-jwt --iam-account $SA_EMAIL_ADDRESS $JWT_FILE $SIGNED_JWT_FILE
echo "Datasets:"
curl -L -H "Authorization: Bearer $(cat $SIGNED_JWT_FILE)" \
-X GET \
"https://bigquery.googleapis.com/bigquery/v2/projects/myproject/datasets?alt=json"
Siguientes pasos
- Más información sobre la autenticación de BigQuery
- Consulta cómo autenticarte con las credenciales de usuario final.