2015-12-14 9 views
4

Я пытаюсь вставить простую запись, как в GoDoc. Но это возвращается,Google Cloud Bigtable аутентификация с Go

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

Когда я искал КПГРЫ кодов, он говорит ..

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()) 
} 
} 
+0

Почему вы делаете JWTConfigFromJSON? Это не должно требоваться ни в MVM, ни в GCP. Вы должны были уже настроены. Взгляните на: https://github.com/GoogleCloudPlatform/gcloud-golang/blob/master/examples/bigtable/bigtable-hello/helloworld.go#L42 или https://github.com/GoogleCloudPlatform/gcloud-golang /blob/master/examples/bigtable/search/search.go#L120, который использует GOOGLE_APPLICATION_CREDENTIALS env var. –

+1

Наш проект может быть размещен или не размещен на разных серверах, отличных от виртуальных машин Google, поэтому нужна аутентификация, которая будет работать в любом месте. – PrasadJay

ответ

3

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

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

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

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

1

Взгляните: 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>.

+0

Проект использует центральную конфигурационную систему, нам не разрешено создавать другие конфигурации, а не потому, что серверы могут быть или не быть виртуальными машинами Google. Вот почему. – PrasadJay