谷歌访问令牌在云功能中不起作用

我使用云函数下提供的此示例向另一个 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 管理员权限授予用于创建云功能的服务帐户。


我是否误解了文档的内容?似乎应该自动添加授权标头。


弑天下
浏览 96回答 1
1回答

小唯快跑啊

这样可以更轻松地不从头开始生成请求,而是使用客户端库。它以每种语言提供惯用、生成或手写的代码,使云 API 使用起来简单直观。它还为您处理身份验证。根据您关注的内容,客户端会自动添加“授权”标头,因此这应该不是问题所在。你还尝试遵循生成标识令牌的示例,因为调用具有身份验证的 Cloud Function 终结点需要标识令牌。这在您的使用案例中有所不同,因为调用 GCP API 需要 OAuth 2 访问令牌。此链接解释了两者之间的区别。有一些方法可以通过编程方式生成访问令牌,例如从元数据服务器获取它们,就像我在其他答案中所做的那样(它在Python中,但你也可以在Golang中执行此操作)。但是,我建议更多地了解客户端库的工作原理,并亲自测试它。GitHub 上显示了许多示例来帮助您入门。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go