当我try 使用服务器到服务器身份验证通过服务帐户进行身份验证时,Google/OAuth2包遇到了问题.Google用一个空的刷新令牌字符串来响应一个令牌 struct ,该令牌将在1小时后过期,我无法刷新,因为我没有刷新令牌. 以下是我正在使用的代码片段:

/*
import(
    "github.com/google/go-containerregistry/pkg/authn"
    gcr "github.com/google/go-containerregistry/pkg/name"
    "github.com/google/go-containerregistry/pkg/v1/remote"
)

*/
data, err := ioutil.ReadFile(fmt.Sprintf("%s/%s", path, serviceAccountFilePath))
if err != nil {
   log.Fatalf("Failed to read GCP service account key file: %s", err)
}
ctx := context.Background()
fmt.Println(scopes)
creds, err := google.CredentialsFromJSON(ctx, data, scopes...)

if err != nil {
   log.Fatalf("Failed to load GCP service account credentials: %s", err)

}
t, _ := creds.TokenSource.Token()
fmt.Println(t.Expiry.Sub(time.Now()).String(), t.RefreshToken, ">>>")

r, err := gcr.NewRegistry("https://gcr.io")
if err != nil {
 log.Fatalf("failed to ping registry: %s", err)
}
authToken := authn.FromConfig(authn.AuthConfig{
    RegistryToken: t.AccessToken,
})

repo, err := gcr.NewRepository(fmt.Sprintf("%s/%s", urlPrefix, imageName))
repo.Registry = r
list, err := remote.List(repo, remote.WithAuth(authToken))

output

在使用服务帐户进行身份验证时,我try 了不同的方法,例如CONFIG和JWT,但我仍然得到了相同的结果.

推荐答案

多亏了@DalmTo的提示,我解决了这个问题.

因此,此类问题的修复方法是不使用Google之外的凭据.CredentialsFromJSON()func在将服务帐户传递给该函数时将返回令牌源而不刷新令牌,这意味着您无法在令牌稍后再次到期时刷新令牌.此外,对生成新令牌的预期和重新身份验证对我也不起作用(不知道为什么).

因此,我不得不通过这个函数将服务帐户的JSON转换为JWT

scopes := []string{"https://www.googleapis.com/auth/cloud-platform"}
tokenSource, err := google.JWTAccessTokenSourceWithScope(serviceAccountFileBytes, scopes...)

这种方法之所以有效,是因为它通过服务帐户的属性(如客户端邮箱、客户端id和私有密钥)在内部创建JWT令牌,因为GCP允许我们创建本地JWT令牌并对其进行编码.

Go相关问答推荐

Go GORM创建表,但不创建列

如何在GoFr中为生产和本地环境设置不同的配置?

在Golang中Mergesort的递归/并行实现中出现死锁

如何模拟go的Elastic search SDK?

不接受来自 stdin 的重复输入

无法读取postman 中的表单数据

3 字节切片和有符号整数类型之间的转换

如何根据地址和大小打印字符串

Go time.Parse 无效的 ISO 日期

在 Go 中解组编号的 XML 标签

AWS Lambda 中的 Websocket URL 超时达到错误

为什么docall在singleflight中使用go panic?

linter 警告:返回值被忽略

为什么 net/http 不遵守超过 30 秒的超时持续时间?

替换字符串中的最后一个字符

Golang crypto/rand 线程安全吗?

在 Golang 模板中计算时间/持续时间

Golang invopop jsonschema 使用 if/then/else

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

Go generics:我会在哪里使用 any 而不是 interface{}?