rag*_*vri 8 go google-cloud-platform gcloud
我正在使用谷歌云上的服务帐户。出于某种原因,我想在 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
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到一条错误消息token: <nil>, err: oauth2: cannot fetch token: 400 Bad Request: .
我已经GOOGLE_APPLICATION_CREDENTIALS定义了 env 变量并指向 json 文件。
按原样运行代码会返回错误:
Invalid OAuth scope or ID token audience provided
Run Code Online (Sandbox Code Playgroud)
我从Google 的 OAuth 范围中添加了包罗万象的 Cloud Platform 可写范围:
https://www.googleapis.com/auth/cloud-platform
Run Code Online (Sandbox Code Playgroud)
这样做,似乎有效。见下文:
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我最近在使用这个库时遇到了一些挑战(访问需要 JWT 受众的 Cloud Run 服务)。在朋友的推荐下,我改用了google.golang.org/api/idtoken。API 非常相似。