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

Authentication 在Golang中手动提供Google服务帐户凭据,authentication,go,proxy,google-cloud-platform,Authentication,Go,Proxy,Google Cloud Platform,要通过Go代理库远程连接到Google cloud Mysql数据库,我需要提供服务帐户凭据。这可以通过设置GOOGLE\u APPLICATION\u CREDENTIALS环境变量来实现,但由于我希望应用程序能够在不同的机器上运行,而无需在任何地方设置环境变量,因此这不是一个选项 因此,我必须手动向我的Golang应用程序提供服务帐户凭据。下面的代码(没有身份验证)给出了此错误消息: 默认代理初始化失败;考虑调用代理。init明确:谷歌:找不到默认凭据。有关更多信息,请参阅 Google提供

要通过Go代理库远程连接到Google cloud Mysql数据库,我需要提供服务帐户凭据。这可以通过设置
GOOGLE\u APPLICATION\u CREDENTIALS
环境变量来实现,但由于我希望应用程序能够在不同的机器上运行,而无需在任何地方设置环境变量,因此这不是一个选项

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

默认代理初始化失败;考虑调用代理。init明确:谷歌:找不到默认凭据。有关更多信息,请参阅

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

有人能帮我在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()

}

当使用
cloudsql代理
包时,您并不是直接连接到您的cloudsql实例,而是创建并连接到它。在代理连接中,您必须提供凭据

在云sql包的测试中,有一个示例

如果不手动执行代理,但可以使用http客户端调用代理,并且可以使用凭据创建http客户端

我还没有对此进行测试,但是您可以在调用
DialCfg
之前尝试类似于
proxy.Init(oauth2.NewClient(ctx,oauth2.StaticTokenSource(&oauth2.Token{AccessToken:})),nil,nil的方法

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

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

}
(这主要是一份。)