为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang 中获取谷歌云服务帐户的访问令牌?

在 Golang 中获取谷歌云服务帐户的访问令牌?

Go
犯罪嫌疑人X 2022-12-13 16:31:35
我在谷歌云上使用服务帐户。出于某种原因,我想在 golang 中以编程方式获取访问令牌。我可以gcloud auth application-default print-access-token在命令行上做。谷歌有一个图书馆似乎可以让我获得令牌。这是我尝试使用它的方法:    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 文件。
查看完整描述

1 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

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


Invalid OAuth scope or ID token audience provided

我从Google 的 OAuth 范围添加了 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 受众的 Cloud Run 服务)。在朋友的推荐下,我改用了google.golang.org/api/idtoken。API 非常相似。


查看完整回答
反对 回复 2022-12-13
  • 1 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信