gcloud auth print-access-token
给我一个 Bearer 令牌,我可以稍后使用;然而,这是一个 shell 命令。我如何通过 Google Cloud Python API 以编程方式获得一个?
我看到一个使用 oauth2client 的 先前示例,但 oauth2client
现已弃用。我将如何使用 google.auth 和 oauthlib 执行此操作?
原文由 indraniel 发布,翻译遵循 CC BY-SA 4.0 许可协议
gcloud auth print-access-token
给我一个 Bearer 令牌,我可以稍后使用;然而,这是一个 shell 命令。我如何通过 Google Cloud Python API 以编程方式获得一个?
我看到一个使用 oauth2client 的 先前示例,但 oauth2client
现已弃用。我将如何使用 google.auth 和 oauthlib 执行此操作?
原文由 indraniel 发布,翻译遵循 CC BY-SA 4.0 许可协议
虽然上面的答案非常有用,但它遗漏了一个重点——从 google.auth.default()
或 compute_engine.Credentials()
获得的凭据对象将没有令牌。回到最初的问题,什么是 gcloud auth print-access-token
的编程替代方案,我的回答是:
import google.auth
import google.auth.transport.requests
creds, project = google.auth.default()
# creds.valid is False, and creds.token is None
# Need to refresh credentials to populate those
auth_req = google.auth.transport.requests.Request()
creds.refresh(auth_req)
# Now you can use creds.token
我正在使用官方的 google-auth 包和 默认凭据,这将使您在本地开发人员和远程 GCE/GKE 应用程序上都可以使用。
太糟糕了,这没有正确记录,我不得不阅读 google-auth 代码 来弄清楚我们如何获取令牌。
原文由 Zaar Hai 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
答案取决于您的环境以及您希望如何创建/获取凭据。
什么是谷歌云凭证?
Google Cloud 凭据是 OAuth 2.0 令牌。 This token has at a minimum an
Access Token
and optionally aRefresh Token
,Client ID Token
, and supporting parameters such asexpiration
,Service Account Email
或Client Email
等Google Cloud API 中的重要项目是
Access Token
。此令牌用于授权访问云。此令牌可用于 --- 等程序,curl
python
软件,不需要 SDK。Access Token
用于 HTTPAuthorization
标头。什么是访问令牌?
访问令牌是由 Google 生成的不透明值,它派生自已签名的 JWT,更准确地说是 JWS。 JWT 由标头和声明(有效负载)Json 结构组成。这两个 Json 结构使用服务帐户的私钥签名。这些值经过 base64 编码并连接起来以创建访问密钥。
访问令牌的格式为:
base64(header) + '.' + base64(payload) + '.' + base64(signature)
。这是一个 JWT 示例:
标头:
有效载荷:
使用访问令牌:
将启动 VM 实例的示例。替换 PROJECT_ID、ZONE 和 INSTANCE_NAME。此示例适用于 Windows。
计算引擎服务帐户:
对于这种情况,Dustin 的回答是正确的,但为了完整性,我将包括一些其他信息。
这些凭据由 GCP 自动为您创建,并从 VM 实例元数据中获取。权限由 Google 控制台中的
Cloud API access scopes
控制。但是,这些凭据有一些限制。要修改凭据,您必须先停止 VM 实例。此外,并非所有权限(角色)都受支持。
服务帐户凭据:
在您了解所有类型的凭据及其用例之前,这些是您将用于除
gcloud
和gsutil
之外的所有内容的凭据。了解这些凭据将使编写程序时使用 Google Cloud 变得更加简单。从 Google 服务帐户 Json 文件获取凭据很容易。唯一需要注意的是凭据过期(通常为 60 分钟)并且需要刷新或重新创建。gcloud auth print-access-token
。服务帐户凭据是 Google 推荐的方法。这些凭据由控制台、gcloud 或通过程序/API 创建。权限由 IAM 分配给信用凭证,并在 Compute Engine、App Engine、Firestore、Kubernetes 等以及 Google Cloud 之外的其他环境中运行。这些凭据从 Google Cloud 下载并存储在 Json 文件中。注意
scopes
参数。这定义了授予生成的凭据对象的权限。谷歌 OAuth 2.0 凭据:
这些凭据源自完整的 OAuth 2.0 流程。这些凭据是在启动浏览器以访问 Google 帐户以授权访问时生成的。这个过程要复杂得多,需要大量的代码来实现,并且需要一个内置的 Web 服务器来回调授权。
此方法提供了额外的功能,例如能够在浏览器中运行所有内容,例如您可以创建一个云存储文件浏览器,但请注意您了解安全隐患。此方法是用于支持 Google 登录等的技术。我喜欢在允许在网站上发帖之前使用此方法对用户进行身份验证等。正确授权的 OAuth 2.0 身份和范围的可能性是无穷无尽的。
使用
google_auth_oauthlib
示例代码:使用
requests_oauthlib
库的示例代码: