在没有 gcloud 的情况下获取服务帐户身份验证令牌?
Posted
技术标签:
【中文标题】在没有 gcloud 的情况下获取服务帐户身份验证令牌?【英文标题】:Get service account auth token without gcloud? 【发布时间】:2018-04-14 01:44:45 【问题描述】:是否可以在不使用gcloud
的情况下为 Google Cloud 服务帐户获取授权持有者令牌?
也就是说,我想发出一个 HTTP 请求(可能由我的 JSON 密钥文件以某种方式签名),它可以为我提供相当于
gcloud auth application-default print-access-token
此请求将在我自己的服务器上发出,我可能不希望安装 gcloud
并且我无权访问可能提供此功能的任何内部服务器元数据(例如,与 Compute Engine 一样) .
是否有一些提供类似功能的 oauth 端点?
或者,有没有办法使用gcloud
生成长期存在的令牌?
我是 Google Cloud 生态系统的新手,请原谅我的无知和术语...
【问题讨论】:
【参考方案1】:我认为这正是您正在寻找的:
https://developers.google.com/identity/protocols/OAuth2#serviceaccount
老实说,我不认为你试图实现的目标是正确的,运行
gcloud auth application-default print-access-token
你得到一个不打算做你正在寻找的事情的令牌:
“当您开发通常使用服务帐户但需要在更容易提供用户凭据的本地开发环境中运行代码时,此命令很有用。”
这应该会在实施此解决方案时为您提供更多指导: https://developers.google.com/identity/protocols/OAuth2ServiceAccount
【讨论】:
谢谢,我想这正是我需要的!我查看的所有云 API 示例/教程都使用了gcloud
auth 机制...
我遇到了类似的问题@JacobBrown。你能解决这个问题并给我一些代码吗?我对此完全陌生,并试图将 chrome 扩展连接到我的 google cloud ml 模型。我应该做一个如下所示的 CURL 请求: $ curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ automl.googleapis.com/v1/projects/1243/locations/us-central1/…\-d request.json【参考方案2】:
这是它在 golang 中的样子:
import(
"google.golang.org/api/compute/v1"
"google.golang.org/api/container/v1"
"google.golang.org/api/iterator"
"google.golang.org/api/option"
"google.golang.org/api/transport"
)
ctx := context.Background()
creds, err := transport.Creds(ctx, option.WithScopes(compute.CloudPlatformScope))
token, err := creds.TokenSource.Token()
【讨论】:
【参考方案3】:对于您的第二个问题,“有什么方法可以使用 gcloud 生成长期存在的令牌吗?”,不,没有。但是,您可以使用刷新令牌来生成新的访问令牌。 检查此问题的第一个答案:
OAuth2 and Google API: Access token expiration time?
此外,这是一个可用作身份验证机制的 python 库示例:
https://github.com/GoogleCloudPlatform/google-auth-library-python/blob/master/google/oauth2/credentials.py
【讨论】:
感谢您的链接!【参考方案4】:不需要库或 api。您可以使用
curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google" | jq -r .access_token
如果您在 shell 脚本中需要它,它会很有用。
【讨论】:
这是一个有用的sn-p。不过,您需要提供一些上下文 - 这仅适用于 GCE VM,并且将使用该 VM 服务帐户。我怀疑对此感到困惑,这就是为什么这被否决了。我还要注意您正在使用 API - 实例元数据 API:cloud.google.com/appengine/docs/standard/java/…【参考方案5】:我认为这是你需要的:
https://github.com/googleapis/google-auth-library-java#explicit-credential-loading
显式凭据加载 要从服务帐户 JSON 密钥获取凭据,请使用 GoogleCredentials.fromStream(InputStream) 或 GoogleCredentials.fromStream(InputStream, HttpTransportFactory)。请注意,必须在访问令牌可用之前刷新凭据。
GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream("/path/to/credentials.json"));
credentials.refreshIfExpired();
AccessToken token = credentials.getAccessToken();
// OR
AccessToken token = credentials.refreshAccessToken();
【讨论】:
以上是关于在没有 gcloud 的情况下获取服务帐户身份验证令牌?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有身份验证的情况下直接向 SMTP 服务器发送邮件?