Как получить разрешения на локальном компьютере для API Google Cloud (firestore) - PullRequest
0 голосов
/ 07 сентября 2018

Я новичок в 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.

Правила пожарного депо - я открыл свои правила пожарного депо, думая, что это проблема.

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

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

У меня была такая же проблема, это печально документация предоставляет только самые трудные способы сделать это, так как для новичка важно сначала сделать как можно проще, но в любом случае это самые простые шаги это:

Если у вас уже есть вход в консоль, перейдите к шагу 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 облака Google, я думаю,

О вашем коде:

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
    }

Прочитайте документацию для получения дополнительной информации

0 голосов
/ 08 сентября 2018

документы говорят мне, что Doc() возвращает *DocumentRef, ссылку на документ. Чтобы получить сам документ, вы должны вызвать Get(), что дает вам *DocumentSnapshot, и, наконец, позвонить Data() для этого.

ref := client.Doc("profile/test3")
snap, err := ref.Get(ctx)
// FIXME error checking
data := snap.Data()
...