不使用gcloud如何获取服务帐号的身份验证令牌?

33

不使用gcloud,是否可以获取Google Cloud服务帐户的授权令牌?

也就是说,我想发出HTTP请求(可能以某种方式签名我的JSON密钥文件),以便为我提供相当于gcloud auth application-default print-access-token命令所提供的内容。

gcloud auth application-default print-access-token

我希望在我的服务器上发出此请求,但我可能不想安装gcloud,也无法访问任何可能提供此类信息的内部服务器元数据(例如Compute Engine中的情况)。

是否有一些OAuth端点可以提供类似功能?

或者,是否有一种使用gcloud生成长寿命令牌的方法?

我是Google Cloud生态系统的新手,所以请原谅我的无知和术语...

5个回答

20

我认为这正是你要找的内容:

https://developers.google.com/identity/protocols/OAuth2#serviceaccount

说实话,我不认为你之前尝试的方法是正确的,运行

gcloud auth application-default print-access-token

你获取了一个不符合你所期望的目的的令牌:

"这个命令在开发代码时非常有用,因为它通常会使用一个服务账户,但需要在本地开发环境中运行代码,在这种情况下提供用户凭据更容易。"

以下链接可以更好地指导你实现此解决方案: https://developers.google.com/identity/protocols/OAuth2ServiceAccount


谢谢,我想那正是我所需要的!我找到的所有云API示例/教程都只使用了“gcloud”身份验证机制... - Jacob Brown
我和 @JacobBrown 遇到了类似的问题。你能解决这个问题并提供一些代码吗?我完全是新手,正在尝试将 Chrome 扩展连接到我的 Google Cloud ML 模型。我应该执行一个 CURL 请求,看起来像这样:$ curl -X POST
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)"
-H "Content-Type: application/json"
https://automl.googleapis.com/v1/projects/1243/locations/us-central1/models/TCN824464:predict
-d request.json
- Mauritius

4
如果您的代码运行在GCE VM上,并且不介意使用该VM所属的服务帐户,那么无需使用库或API。您可以使用curl获取访问令牌:
curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google" | jq -r .access_token

如果您需要在shell脚本中使用它,那么它将非常有用。


6
这是一个有用的代码片段。但你需要提供一些背景信息 - 它只能从GCE VM上运行,并且会使用该VM的服务账号。我怀疑混淆也许是它被踩血的原因。此外,我注意到你确实在使用一个API——实例元数据API:https://cloud.google.com/appengine/docs/standard/java/accessing-instance-metadata - Julian
这是今天我的第一个救命稻草。如果您正在使用Cloud Build,则这是我的第二个救命稻草:https://dev59.com/i8Lra4cB1Zd3GeqPTuGW#70146668 - Andy

4
这是用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()

2

谢谢提供链接! - Jacob Brown

0
我认为这就是你需要的:

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接