首页 > 解决方案 > 如何在本地计算机中获取 Google Cloud api(firestore)的权限

问题描述

我是 fireStore 的新手并试图检索文档值,但它没有像我预期的那样工作。尝试通过我的 IDE 和 golang 访问时,我收到“权限被拒绝”。

代码:

func TestConnectToCollection(t *testing.T) {

    ctx := context.Background()
    client, err := firestore.NewClient(ctx, "<my-Project-ID>")
    if err != nil {
        // TODO: Handle error.
    }
    defer client.Close()
    doc := client.Doc("profile/test3")
    fmt.Println(doc)
    fmt.Println(doc.ID)

    iter := client.Collection("profile").Documents(ctx)
    for {
        doc, error := iter.Next()
        if error == iterator.Done {
            break
        }
        if error != nil {
            fmt.Println(error.Error())
        } else {
            fmt.Println(doc.Data())
        }
    }
}

输出:

&{0xc0001725a0 projects/<project-id>/databases/(default)/documents/profile/test3 test3}
test3
rpc error: code = PermissionDenied desc = Missing or insufficient permissions.
rpc error: code = PermissionDenied desc = Missing or insufficient permissions.
rpc error: code = PermissionDenied desc = Missing or insufficient permissions.
rpc error: code = PermissionDenied desc = Missing or insufficient permissions.

Firestore 规则 - 我打开了我的 Firestore 规则,认为这是问题所在。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}

标签: gogoogle-cloud-platformgoogle-cloud-firestore

解决方案


我有同样的问题,很遗憾文档只提供了最困难的方法,作为初学者,一开始尽可能简单是很重要的,但无论如何这些是最简单的步骤:

如果您已经登录控制台,请跳至步骤 5

  1. 安装gcloud
  2. 在命令行上运行gcloud auth login
  3. 使用拥有该项目的 google 帐户登录
  4. 在您的代码中,您的配置客户端应该是这样的:

    ctx := context.Background()
    client, err := firestore.NewClient(ctx, projectID)
    if err != nil {
        log.Fatal(err)
    }
    
  5. 在命令行上运行gcloud beta auth application-default login

就是这样!这就像魔术一样,尝试其他方式时我太头疼了。这也适用于云存储,我猜任何谷歌云 api

关于您的代码:

client.Doc("profile/test3")

你根本没有得到任何文件,它只是创建一个*DocumentRef,以便获得你应该做的文件:

    ctx:=context.Background()
    snapShot,err:=client.Doc("profile/test3").Get(ctx)
    if err!=nil{
    log.Println(err)
    return err
    }
    var myStruct myStructType
    if err=snapShot.DataTo(&myStruct);err!=nil{
    log.Println(err)
    return err
    }

阅读文档以获取更多信息


推荐阅读