2015-12-14 74 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