在Golang中手动提供Google服务帐户凭据

时间:2018-02-07 18:56:28

标签: authentication go proxy google-cloud-platform

要通过Go Proxy库远程连接到Google-Cloud Mysql数据库,我需要提供服务帐户凭据。这可以通过设置GOOGLE_APPLICATION_CREDENTIALS环境变量来完成,但由于我希望应用程序能够在不同的机器上运行而不必在任何地方设置环境变量,所以这不是一个选项。

因此,我必须手动向Golang应用程序提供服务帐户凭据。下面的代码(没有身份验证)给出了以下错误消息:

  

默认代理初始化失败;考虑调用proxy.Init显式:google:找不到默认凭据。有关详细信息,请参阅https://developers.google.com/accounts/docs/application-default-credentials

Google提供了有关如何修复多种编程语言的手动身份验证的详细文档,但不提供Go:

  

https://cloud.google.com/docs/authentication/production#auth-cloud-explicit-csharp

有没有人可以帮我解决在Golang中手动设置身份验证凭据的问题?

非常感谢!

package main

import (
    "database/sql"
    "fmt"
    "github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/mysql"
)

var db *sql.DB

func main() {

cfg := mysql.Cfg("mysql", "********", "********") //name , username, password
cfg.DBName = "MyDBName"
db := mysql.DialCfg(cfg)
defer db.Close()

}

1 个答案:

答案 0 :(得分:0)

使用cloudsql-proxy软件包时,您不是直接连接到您的云SQL实例,而是创建proxy并连接到它。它是您必须提供凭据的代理连接。

在cloud-sql包的测试中,有一个how to init the proxy with credentials的例子。

代理initializes by itself如果您不是手动执行此操作,但可以使用http客户端调用proxy.Init,并且可以使用凭据创建http客户端。

我没有对此进行测试,但您可以在proxy.Init(oauth2.NewClient(ctx, oauth2.StaticTokenSource(&oauth2.Token{AccessToken: <YOUR_TOKEN>})), nil, nil)来电之前尝试DialCfg之类的内容。

更好的例子,如果您提供您的凭证文件(因此它不是硬编码的)将类似于:

func main()
  credsFile := "path/to/your/credentials.json"
  SQLScope := "https://www.googleapis.com/auth/sqlservice.admin"
  ctx := context.Background()

  creds, err := ioutil.ReadFile(credsFile)
  if err != nil {
    # handle error
  }

  cfg, err := goauth.JWTConfigFromJSON(creds, SQLScope)
  if err != nil {
    # handle error
  }

  client := cfg.Client(ctx)
  proxy.Init(client, nil, nil)

  var db *sql.DB

  cfg := mysql.Cfg("mysql", "********", "********") //name , username, password
  cfg.DBName = "MyDBName"
  db, err := mysql.DialCfg(cfg)
  if err != nil {
    # handle error
  }
  defer db.Close()

  # your calls to cloudSQL

}

(这主要是the tests on that package的副本。)