为了将来参考(这个问题已经很老了,但它似乎仍然是一个问题),现在 GCP IAM API 有一个端点来获取具有任意范围的访问令牌。我将此问题理解为 2 条腿 OAuth 流程(应用程序可以访问自己的 Drive 文件),而不是 3 条腿 OAuth 流程(应用程序代表客户请求访问 Drive API) .
该端点用于服务帐户委托,这是一个更复杂的流程。
您可以使用以下命令获得服务帐户的正确权限,以便为自己生成令牌:
gcloud iam service-accounts add-iam-policy-binding $(gcloud config get-value project)@appspot.gserviceaccount.com --member serviceAccount:$(gcloud config get-value project)@appspot.gserviceaccount.com --role roles/iam.serviceAccountTokenCreator
例子
一旦服务帐户具有正确的权限,您可以通过首先在 CLI 上进行身份验证来获取具有正确范围的令牌(GAE 不需要此步骤,因为默认服务帐户已经过身份验证):
gcloud iam service-accounts keys create key --iam-account $(gcloud config get-value project)@appspot.gserviceaccount.com
gcloud auth activate-service-account $(gcloud config get-value project)@appspot.gserviceaccount.com --key-file key
gcloud config set account $(gcloud config get-value project)@appspot.gserviceaccount.com
然后,您可以对 IAM API 进行经过身份验证的调用,以获取具有不同范围的令牌:
curl -H"Authorization: Bearer $(gcloud auth print-access-token)" -H'content-type:application/json' https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/$(gcloud config get-value project)@appspot.gserviceaccount.com:generateAccessToken -d"{'scope':['https://www.googleapis.com/auth/drive']}"
使用此令牌,您可以直接为默认 GAE 服务帐户 () 有权访问的文件调用 Drive API:
token=$(curl -H"Authorization: Bearer $(gcloud auth print-access-token)" -H'content-type:application/json' https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/$(gcloud config get-value project)@appspot.gserviceaccount.com:generateAccessToken -d"{'scope':['https://www.googleapis.com/auth/drive']}"|jq -r .accessToken)
curl -H"Authorization: Bearer $token" https://www.googleapis.com/drive/v3/files/<FILE_ID>
最后,记得清理(删除此示例的键):
gcloud iam service-accounts keys delete $(cat key|jq -r .private_key_id) --iam-account $(cat key|jq -r .client_email) -q
gcloud auth revoke $(gcloud config get-value project)@appspot.gserviceaccount.com
rm key
要进行调用以从 GAE 生成访问令牌,您可以使用Google Cloud Client Libraries。对于 Python,您将使用google.cloud.iam_credentials_v1.IAMCredentialsClient.generate_access_token。
总结一下:
- 授予
iam.serviceAccountTokenCreator
GAE 默认服务帐户
- 授予该帐户对特定驱动器文件的访问权限
projects.serviceAccounts/generateAccessToken
从 IAM 凭证 API ( )生成具有正确范围的令牌
- 使用该令牌对 Drive API 进行经过身份验证的调用
为获得最佳结果,请在初始化期间生成令牌,对其进行缓存,然后每小时重新创建一次(1 小时是生成的访问令牌的最大 TTL)。