【问题标题】:How to publish to PubSub using personal (gcloud) credentials如何使用个人 (gcloud) 凭据发布到 PubSub
【发布时间】:2020-06-22 02:35:19
【问题描述】:

我正在尝试使用与 gcloud CLI 相同的凭据向 GCP PubSub 发布消息,但没有取得很大成功。

我可以通过以下方式确认我可以发布到某个主题

gcloud pubsub topics publish myTopic --project "myProject" --message "Hello World!"

但是,当我使用下面的代码尝试使用与 gcloud 完全相同的凭据时

creds, err := google.FindDefaultCredentials(context.Background())
if err != nil {
    panic(fmt.Sprintf("Unable to retrieve default credentials: %v", err))
}
client, err := pubsub.NewClient(ctx, "myproject", option.WithCredentials(creds))
if err != nil {
    panic(fmt.Sprintf("unable to create GCP storage client: %v", err))
}
topic := client.Topic("myTopic")
r := topic.Publish(ctx, &pubsub.Message{
    Data: []byte("Hello World!"),
})
_, err = r.Get(ctx)
if err != nil {
    panic(fmt.Sprintf("failed to publish message: %v", err))
}

我收到以下错误消息

panic: failed to publish message: rpc error: code = Unauthenticated desc = transport: oauth2: cannot fetch token: 400 Bad Request
Response: {
  "error": "invalid_grant",
  "error_description": "Bad Request"
}

我还尝试直接加载 json 文件,以确保它没有在某处获取其他默认凭据,但出现相同的错误。

如何使用与 gcloud CLI 相同的凭据发布到我有权访问的 pubsub 主题?

【问题讨论】:

  • 您在 CLI 中加载的凭据是什么?你是怎么做到的?
  • 我需要登录 gcloud 已经有一段时间了,但我相信它使用的是南流,gcloud 打开一个 Web 浏览器,我登录浏览器,然后它在本地存储一个令牌。从那以后我再也不需要登录 gcloud
  • 好的,知道了。我发布了一个答案,它应该可以工作

标签: go google-cloud-platform google-cloud-pubsub


【解决方案1】:

您是否尝试过模拟服务帐户选项? [1] 也许这就是您正在寻找的。希望对您有所帮助...

[1]https://cloud.google.com/sdk/gcloud/reference#--impersonate-service-account

【讨论】:

    【解决方案2】:

    您需要在 Go 脚本中使用 set up authentication。默认情况下,它将使用与您运行代码的环境中存在的凭据相同的凭据。

    这是在创建存储桶时使用默认凭据设置新客户端的示例:

    package main
    
    import (
        "context"
        "fmt"
        "log"
        "time"
    
        "cloud.google.com/go/storage" 
    
    
    func main() {
        ctx := context.Background()
    
        // Sets your Google Cloud Platform project ID.
        projectID := "YOUR_PROJECT_ID"
    
        // Creates a client.
        client, err := storage.NewClient(ctx)
        if err != nil {
                log.Fatalf("Failed to create client: %v", err)
        }
    

    因此,在您的代码中试试这个:

    ctx := context.Background()
    client := pubsub.NewClient(ctx)
    

    【讨论】:

    • 我不明白你的意思。您的代码只是创建了一个新的存储客户端。除了创建 PubSub 客户端外,我也在做同样的事情。您的链接中描述的身份验证部分谈到了创建一个我不想做的服务帐户。显然,可以像 gcloud 那样使用我自己的凭据,而无需我创建服务帐户。也许我误解了你的意思?
    • 我修改了我的答案以更具体。希望对您有所帮助!
    【解决方案3】:

    当我配置本地环境时,我正在这样做

    • 运行命令:gcloud auth application-default login
    • 单击链接并分配 Google 身份验证库

    命令的结果应该是这样的

    Credentials saved to file: [/path/to/application_default_credentials.json]
    
    These credentials will be used by any library that requests Application Default Credentials (ADC).
    
    • 复制/path/to/application_default_credentials.json
    • 使用该值创建环境变量GOOGLE_APPLICATION_CREDENTIALS。在linux中:export GOOGLE_APPLICATION_CREDENTIALS=/path/to/application_default_credentials.json

    现在,您的个人凭据也被定义为在本地环境中运行的应用的默认凭据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 2020-08-25
      • 2020-10-20
      • 2021-07-19
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      相关资源
      最近更新 更多