使用 JWT 进行身份验证
BigQuery API 接受 JSON Web 令牌 (JWT),以对请求进行身份验证。
最佳实践是使用应用默认凭据 (ADC) 向 BigQuery 进行身份验证。如果您无法使用 ADC 并且使用服务账号进行身份验证,则可以改为使用签名 JWT。JWT 可让您在不向 Google 授权服务器发出网络请求的情况下进行 API 调用。
您可以通过以下方式使用 JWT 进行身份验证:
- 对于在 Google Cloud 控制台中或使用 gcloud CLI 创建的服务账号密钥,请使用提供 JWT 签名的客户端库。
- 对于系统管理的服务账号,请使用 REST API 或 gcloud CLI。
范围和目标对象
尽可能将范围与服务账号搭配使用。如果无法这样做,您可以使用目标对象声明。对于 BigQuery API,请将接收方值设置为 https://bigquery.googleapis.com/
。
使用客户端库创建 JWT
对于在 Google Cloud 控制台中或使用 gcloud CLI 创建的服务账号密钥,请使用提供 JWT 签名的客户端库。以下列表提供了一些适用于常用编程语言的选项:
- Go:func JWTAccessTokenSourceFromJSON
- Java:ServiceAccountCredentials 类
- Node.js:JWTAccess 类
- PHP:ServiceAccountJwtAccessCredentials
- Python:google.auth.jwt 模块
- Ruby:Google::Auth::ServiceAccountJwtHeaderCredentials 类
Java 示例
以下示例使用 Java 版 BigQuery 客户端库创建和签署 JWT。 BigQuery API 的默认范围在客户端库中设置为 https://www.googleapis.com/auth/bigquery
。
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()));
}
}
使用 REST 或 gcloud CLI 创建 JWT
对于系统管理的服务账号,您必须手动组合 JWT,然后使用 REST 方法 projects.serviceAccounts.signJwt
或 Google Cloud CLI 命令 gcloud beta iam service-accounts sign-jwt
来签署 JWT。如需使用上述任何一种方法,您必须是 Service Account Token Creator Identity and Access Management 角色的成员。
gcloud CLI 示例
以下示例展示了一个 bash 脚本,该脚本组合 JWT,然后使用 gcloud beta iam service-accounts sign-jwt
命令来签署它。
#!/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"
后续步骤
- 详细了解 BigQuery 身份验证。
- 了解如何使用最终用户凭据进行身份验证。