我使用云函数下提供的此示例向另一个 GCP API 发出 GET 请求:import ( "context" "fmt" "io" "google.golang.org/api/idtoken")func makeGetRequest(w io.Writer, targetURL string) error { ctx := context.Background() client, err := idtoken.NewClient(ctx, targetURL) if err != nil { return fmt.Errorf("idtoken.NewClient: %v", err) } resp, err := client.Get(targetURL) if err != nil { return fmt.Errorf("client.Get: %v", err) } defer resp.Body.Close() if _, err := io.Copy(w, resp.Body); err != nil { return fmt.Errorf("io.Copy: %v", err) } return nil}但是当我记录发送的请求时,我没有看到任何授权标头,并且我收到以下错误:"Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.\"我已将 serviceAccountTokenCreator 和目标 GCP API 管理员权限授予用于创建云功能的服务帐户。我是否误解了文档的内容?似乎应该自动添加授权标头。
1 回答
小唯快跑啊
TA贡献1863条经验 获得超2个赞
这样可以更轻松地不从头开始生成请求,而是使用客户端库。它以每种语言提供惯用、生成或手写的代码,使云 API 使用起来简单直观。它还为您处理身份验证。
根据您关注的内容,客户端会自动添加“授权”标头,因此这应该不是问题所在。你还尝试遵循生成标识令牌的示例,因为调用具有身份验证的 Cloud Function 终结点需要标识令牌。这在您的使用案例中有所不同,因为调用 GCP API 需要 OAuth 2 访问令牌。此链接解释了两者之间的区别。
有一些方法可以通过编程方式生成访问令牌,例如从元数据服务器获取它们,就像我在其他答案中所做的那样(它在Python中,但你也可以在Golang中执行此操作)。但是,我建议更多地了解客户端库的工作原理,并亲自测试它。GitHub 上显示了许多示例来帮助您入门。
- 1 回答
- 0 关注
- 93 浏览
添加回答
举报
0/150
提交
取消