Аутентификация Google Cloud Bigtable с Go

Пытаюсь вставить простую запись как в GoDoc. Но это возвращается,

rpc error: code = 7 desc = "User can't access project: tidy-groove"

Когда я искал коды grpc, он говорит ...

PermissionDenied Code = 7

// Unauthenticated indicates the request does not have valid
// authentication credentials for the operation.

Я включил большую таблицу в своей консоли, создал кластер и учетную запись службы и получил файл json. Что я здесь делаю не так?

package main

import (
"fmt"
"golang.org/x/net/context"
"golang.org/x/oauth2/google"
"google.golang.org/cloud"
"google.golang.org/cloud/bigtable"
"io/ioutil"
)

func main() {
fmt.Println("Start!")
put()
}

func getClient() *bigtable.Client {
jsonKey, err := ioutil.ReadFile("TestProject-7854ea9op741.json")
if err != nil {
    fmt.Println(err.Error())
}

config, err := google.JWTConfigFromJSON(
    jsonKey,
    bigtable.Scope,
) // or bigtable.AdminScope, etc.

if err != nil {
    fmt.Println(err.Error())
}

ctx := context.Background()
client, err := bigtable.NewClient(ctx, "tidy-groove", "asia-east1-b", "test1-bigtable", cloud.WithTokenSource(config.TokenSource(ctx)))

if err != nil {
    fmt.Println(err.Error())
}

return client
}

func put() {
ctx := context.Background()
client := getClient()
tbl := client.Open("table1")
mut := bigtable.NewMutation()
mut.Set("links", "maps.google.com", bigtable.Now(), []byte("1"))
mut.Set("links", "golang.org", bigtable.Now(), []byte("1"))
err := tbl.Apply(ctx, "com.google.cloud", mut)
if err != nil {
    fmt.Println(err.Error())
}
}

person PrasadJay    schedule 14.12.2015    source источник
comment
Почему вы делаете JWTConfigFromJSON? Этого не должно быть ни в MVM, ни в GCP. Вы уже должны были быть настроены. Взгляните на: github .com / GoogleCloudPlatform / gcloud-golang / blob / master / или github.com/GoogleCloudPlatform/gcloud-golang/blob/master/, который использует GOOGLE_APPLICATION_CREDENTIALS env var.   -  person Les Vogel - Google DevRel    schedule 14.12.2015
comment
Наш проект может размещаться или не размещаться на отдельных серверах, кроме виртуальных машин Google, поэтому потребуется аутентификация, которая будет работать где угодно.   -  person PrasadJay    schedule 16.12.2015


Ответы (2)


Я решил проблему. В коде нет ничего плохого, но конфиг json сам. Итак, любой, кто хочет пройти аутентификацию и пришел сюда с помощью поиска Google ... Этот код правильный и отлично работает. Вот что я сделал неправильно.

Сначала я создал сервисный аккаунт и получил файл json. Но Google предупредил меня, что я не владелец проекта, поэтому он не будет добавлен в список принятия, но в любом случае он позволил мне загрузить json. Затем я удалил этот ключ из консоли и попросил владельца проекта создать для меня ключ. Там он создал еще один ключ с тем же именем, что и я. И поскольку он владелец, сообщения об ошибках / предупреждениях не отображаются, и файл json был успешно загружен.

Когда я попробовал с этим ... начался мой вопрос. Вот когда я разместил этот вопрос. После этого без решений. Я попросил владельца удалить этот ключ и создать другой ключ, но с другим именем ..

Тогда это сработало! Кажется, если вы попытаетесь создать ключ с учетной записью, не являющейся владельцем, а затем снова создать с тем же именем (после удаления оригинала, конечно), это не даст никакого эффекта. Надеюсь, это поможет всем :)

person PrasadJay    schedule 16.12.2015

Взгляните на: helloworld. go или search.go, который использует GOOGLE_APPLICATION_CREDENTIALS переменную среды.

Для большинства сред вам больше не нужно даже устанавливать GOOGLE_APPLICATION_CREDENTIALS. Google Cloud Platform, Управляемые виртуальные машины или Google App Engine - все для вас настроено правильно. Среда вашего рабочего стола также будет правильной, если вы использовали gcloud init или его предшественника gcloud auth login, за которым следует gcloud config set project <projectID>.

person Les Vogel - Google DevRel    schedule 15.12.2015
comment
В проекте используется централизованная система конфигурации, нам не разрешено создавать другие конфигурации, кроме этой, поскольку серверы могут быть или не быть виртуальными машинами Google. Вот почему. - person PrasadJay; 16.12.2015