在 Golang 中获取 google 云服务帐户的访问令牌?
Get access token for a google cloud service account in Golang?
我在 google 云上使用服务帐户。出于某种原因,我想在 golang 中以编程方式获取访问令牌。我可以在命令行上做 gcloud auth application-default print-access-token
。
有一个library by google好像可以让我拿到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 文件。
运行修改您的代码 as-is,returns 一个错误:
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 非常相似。
我在 google 云上使用服务帐户。出于某种原因,我想在 golang 中以编程方式获取访问令牌。我可以在命令行上做 gcloud auth application-default print-access-token
。
有一个library by google好像可以让我拿到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 文件。
运行修改您的代码 as-is,returns 一个错误:
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 非常相似。