使用Go进行Google Cloud Bigtable身份验证

时间:2015-12-14 09:07:23

标签: go bigtable google-cloud-bigtable

我试图在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.

我已在我的控制台中启用了Big table,并创建了一个群集和一个服务帐户并收到了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())
}
}

2 个答案:

答案 0 :(得分:3)

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

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

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

然后它奏效了!看起来如果您尝试使用非所有者帐户创建密钥,然后再次使用相同名称创建(在删除原始文件后)无效。希望这能帮助每个人:)

答案 1 :(得分:1)

查看使用GOOGLE_APPLICATION_CREDENTIALS环境变量的helloworld.gosearch.go

对于大多数环境,您甚至不再需要设置GOOGLE_APPLICATION_CREDENTIALS Google云端平台托管虚拟机 Google App Engine 都可以为您设置正确的功能。如果您已使用gcloud init或其前任gcloud auth login后跟gcloud config set project <projectID>,则您的桌面环境也会正确无误。