我正在谷歌云上使用一个服务帐户.出于某种原因,我想在golang中以编程方式获取访问令牌.我可以在命令行上执行gcloud auth application-default print-access-token次.

有一个library by google,似乎可以让我得到 token .以下是我如何try 使用它:

    credentials, err := auth.FindDefaultCredentials(ctx)
    if err == nil {
        glog.Infof("found default credentials. %v", credentials)
        token, err2 := credentials.TokenSource.Token()
        fmt.Printf("token: %v, err: %v", token, err2)
        if err2 != nil {
            return nil, err2
        }

然而,我得到一个错误,说token: <nil>, err: oauth2: cannot fetch token: 400 Bad Request.

我已经定义了GOOGLE_APPLICATION_CREDENTIALS个env变量并指向json文件.

推荐答案

按原样运行代码会返回错误:

Invalid OAuth scope or ID token audience provided

我从Google's OAuth scopes开始添加了catch all Cloud Platform可写范围:

https://www.googleapis.com/auth/cloud-platform

这样做似乎有效.见下文:

package main

import (
    "context"
    "log"

    "golang.org/x/oauth2"
    auth "golang.org/x/oauth2/google"
)

func main() {
    var token *oauth2.Token
    ctx := context.Background()
    scopes := []string{
        "https://www.googleapis.com/auth/cloud-platform",
    }
    credentials, err := auth.FindDefaultCredentials(ctx, scopes...)
    if err == nil {
        log.Printf("found default credentials. %v", credentials)
        token, err = credentials.TokenSource.Token()
        log.Printf("token: %v, err: %v", token, err)
        if err != nil {
            log.Print(err)
        }
    }
}

我最近在使用这个库时遇到了一些挑战(要访问需要JWT受众的云运行服务).根据一位朋友的建议,我用google.golang.org/api/idtoken来代替.API非常相似.

Go相关问答推荐

Go编译器标志-修剪路径不完全工作

运行add. inf,这样我们就可以在app.conf中使用. inf参数了?

具有GRPC的RBAC(基于角色的访问控制)-网关生成的REST风格的API

AWS S3 SelectObjectContent在AWS SDK v2 for Go中不返回结果

使用Golang的Lambda自定义al2运行时,初始化阶段超时

提供的client_secret与此帐户上任何关联的SetupIntent都不匹配

golang regex基于关键字拆分字符串

Secrets Manager Update Secret - Secret String 额外的 JSON 编码

如何使用泛型将接口转换为指定类型

Get 请求在 Thunder 客户端/Postman 中返回数据,但在 Golang 代码中给出空白数据

如何使用struct的方法清除除某些字段之外的struct值

Golang - 将 [8] 布尔转换为字节

我如何解码 aes-256-cfb

使用无服务器工作流 go sdk 时出现间歇性 JSON 解组错误

Go 加密库创建的 PKCS1 公钥与openssl rsa ...之间的区别

如何排除溢出矩阵的坐标

函数的递归调用以 goroutine 和惯用方式开始,以在所有工作 goroutine 完成时继续调用者

即使没有竞争条件也没有得到任何输出

空接口与泛型接口有何不同?

Go 语言的select语句