2015-12-14 67 views
4

我试图在GoDoc中插入一条简单的记录。但这返回,Go Google云端Bigtable身份验证

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()) 
} 
} 
+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 VM的独立服务器中托管,因此需要可在任何地方工作的身份验证。 – PrasadJay

回答

3

我已经解决了这个问题。代码没有问题,但配置json本身。所以,那里的任何人都想通过谷歌搜索进行身份验证并来到这里......这段代码是正确的,并且完美地工作。我做错了以下是。

首先我做了一个服务帐户,并得到了JSON。但谷歌警告说,我不是项目的所有者,因此它不会被添加到接受列表,但无论如何,它让我下载JSON。 然后我从控制台删除了该密钥,并要求项目所有者为我创建密钥。 在那里,他创建了另一个与我给出的名称相同的密钥。并且由于他是所有者,因此没有显示错误/警告消息,并且已成功下载了json文件。

当我试过这个......我的问题开始了。那是我发布这个问题的时候。 之后,没有解决方案。我要求所有者删除该密钥,并创建另一个密钥,但使用不同的名称。

然后它工作!看起来如果你尝试使用非所有者帐户创建密钥,然后再次使用相同的名称创建(当然,删除原创后)不起作用。希望这可以帮助所有人在那里:)

1

看看:helloworld.gosearch.go它采用GOOGLE_APPLICATION_CREDENTIALS环境变量。

对于大多数环境,您甚至不再需要设置GOOGLE_APPLICATION_CREDENTIALS谷歌云平台,托管虚拟机谷歌应用引擎都有适合你的东西。如果您使用gcloud init或其前身gcloud auth login后跟gcloud config set project <projectID>,则您的桌面环境也将是正确的。

+0

项目使用中央配置系统,我们不允许其他配置,而不是由于服务器可能是或不可能是谷歌虚拟机。这就是为什么。 – PrasadJay