Google Cloud Shell中Golang遇invalid_rapt重认证错误的咨询
问题描述
本周首次遇到invalid_rapt重认证错误,场景如下:
- 登录自定义域名的Google Workspace账号(非Gmail.com);
- 使用Google Cloud Shell;
- 开发调用Google Cloud API(如Google Cloud Storage)的Golang项目;
- 未手动执行认证操作,却触发
invalid_rapt错误。
该配置已稳定运行4个月,近期突然异常。但Python代码可正常列出GCS存储桶:
python3 -c 'from google.cloud.storage import Client; print(list(Client().list_buckets()))'
而Golang代码执行失败:
package main import ( "context" "fmt" "log" "cloud.google.com/go/storage" ) func main() { ctx := context.Background() client, err := storage.NewClient(ctx) if err != nil { log.Fatalf("Failed to create client: %v", err) } defer client.Close() it := client.Buckets(ctx, "surfey") fmt.Println("Buckets:") for { attrs, err := it.Next() if err != nil { log.Printf("Failed to list buckets: %v", err) break } fmt.Println(attrs.Name) } }
执行报错信息:
$ ./gobuckets Buckets: 2024/05/15 21:42:37 Failed to list buckets: Get "https://storage.googleapis.com/storage/v1/b?alt=json&pageToken=&prefix=&prettyPrint=false&project=surfey&projection=full": oauth2: "invalid_grant" "reauth related error (invalid_rapt)" "https://support.google.com/a/answer/9368756"
临时解决方案是在Google Workspace Admin中将重认证策略设为“从不要求重认证”,但存在安全风险。另外,在Google Cloud Shell中执行gcloud auth application-default login时,会收到警告提示该环境为GCE实例,无需手动认证。
咨询问题
- 为何默认客户端下Python可正常运行,而Golang不行?
- 不使用本地凭证时如何完成重认证?
- 可标记哪个“应用”为可信,以避免全局关闭重认证?
解答
1. Python与Golang客户端的差异原因
Python的Google Cloud客户端库(google-cloud-storage)在GCE/Cloud Shell环境下,优先使用元数据服务器获取的服务账号凭证,且底层google-auth库自动适配了Workspace的重认证策略,在凭证刷新时能隐式处理rapt(Re-authentication Proof Token)要求。而Golang的cloud.google.com/go/storage客户端未实现自动交互式重认证流程,缓存的旧凭证过期后无法完成符合要求的刷新,导致报错。
另外两者凭证缓存机制不同:Python客户端可能保留了符合重认证要求的有效凭证,而Golang客户端的缓存凭证已失效且无自动修复逻辑。
2. 不使用本地凭证完成重认证的方式
在Cloud Shell环境中,可通过两种方式处理:
- 执行
gcloud auth login:该命令会触发交互式重认证流程,生成符合Workspace重认证要求的用户凭证,覆盖当前默认应用凭证,无需依赖本地文件; - 使用服务账号密钥:创建具备GCS访问权限的服务账号,下载JSON密钥文件后,设置环境变量
GOOGLE_APPLICATION_CREDENTIALS指向该文件。服务账号不受用户重认证策略限制,适合长期运行的应用场景。
3. 标记可信应用避免全局关闭重认证
在Google Workspace Admin控制台中,可信任Google Cloud SDK来绕过重认证要求:
- 进入「安全」>「访问和数据控制」>「API控件」>「信任的应用」;
- 添加应用ID为
1084795499008的「Google Cloud SDK」到信任列表。
信任该应用后,Cloud Shell中由gcloud生成的凭证将不受重认证策略约束,无需全局关闭重认证规则。
内容的提问来源于stack exchange,提问作者Neil C. Obremski

