使用 Go 为远程配置 REST API 验证服务帐户

Authenticate Service Account for Remote Config REST API using Go

Over here the Firebase docs explain how you can retrieve a token required to make requests to the Remote Config Rest API.

它提供了 Python、Java 和 Node.js 的示例代码。因为没有 Go 的代码,它 将我 发送到 Google Client Library (for Go)。你也许能理解我为什么迷路了......

示例使用 GoogleCredential in Java, ServiceAccountCredentials in Python and google.auth.JWT in Node.js. I was not able to find any of those here。不知道为什么没有明确的命名规范。

我找到了

firebaseremoteconfig-gen.go: The code looks like it already implements what the Firebase documentation page tries to achieve "manually". Comparison: doc, package.

帮助

因为"Usage example" of the package结束的很突然,而且是extensive的反义词,不知道怎么用

如果有人能告诉我如何使用它,我会得到帮助:

firebaseremoteconfigService, err := firebaseremoteconfig.New(oauthHttpClient)

我不知道从哪里得到 oauthHttpClient。存储库中有一个 oauth2 包,但我在那里面对 the same problem:

oauth2Service, err := oauth2.New(oauthHttpClient)

我又需要oauthHttpClient,所以这不是解决方案。
http.Client could be anything, but I need to authenticate with a service-account.json file, like shown in the three example snippets here.

标签说明

我希望有人有将 Firebase Remote ConfigGo 集成的经验,有人知道 Google Client API authentication 是如何工作的,或者有人知道 Go 了解用法。

有几种使用 google API 进行身份验证的主要方法,它们记录在此处:

Link to docs

记录的方式是“三足 OAuth”,"Using API Keys" 最后是 "Service Accounts"。

来自问题中包含的链接;您正在查看 Python / Java / "Service Accounts".

的节点示例

在 go 中使用服务帐户

您所指的 oauthHttpClient 是一个 http 客户端,它会自动将身份验证信息附加到请求中。

您可以使用此包创建一个:

https://godoc.org/golang.org/x/oauth2/google

以其他语言链接的示例使用 "service account json key file"。

使用下面链接的方法,您可以读取该密钥文件并创建一个 jwt.Config 结构,让您可以访问所需的客户端。

https://godoc.org/golang.org/x/oauth2/google#JWTConfigFromJSON

链接的其他语言示例的 go 等价物是;

data, err := ioutil.ReadFile("/path/to/your-project-key.json")
if err != nil {
    log.Fatal(err)
}
conf, err := google.JWTConfigFromJSON(data, "https://www.googleapis.com/auth/firebase.remoteconfig")
if err != nil {
    log.Fatal(err)
}
// Initiate an http.Client. The following GET request will be
// authorized and authenticated on the behalf of
// your service account.
client := conf.Client(oauth2.NoContext)
client.Get("...")

我刚开始使用相同的库(来自 AppEngine 标准项目)。这就是我创建服务客户端的方式:

import (
    "context"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"

    "golang.org/x/oauth2/google"
    fb "google.golang.org/api/firebaseremoteconfig/v1"
    "google.golang.org/appengine"
    "google.golang.org/appengine/log"
)

const (
    // Name of our service account file
    saFileName = "my-firebase-sa.json"

    // OAuth scopes used for remote config API
    scopeRemoteConfig = "https://www.googleapis.com/auth/firebase.remoteconfig"
)

func createFirebaseService(ctx context.Context) (*fb.Service, error) {
    data, err := ioutil.ReadFile(saFileName)
    if err != nil {
        return nil, err
    }

    conf, err := google.JWTConfigFromJSON(data, scopeRemoteConfig)
    if err != nil {
        return nil, err
    }

    return fb.New(conf.Client(ctx))
}

我这样称呼它:

func fetchConfig(ctx context.Context) (*fb.RemoteConfig, error) {
    s, err := createFirebaseService(ctx)
    if err != nil {
        log.Errorf(ctx, "Failed to create firebase service: %v", err)
        return nil, fmt.Errorf("Failed to initialize Firebase service")
    }

    projectID := "projects/" + appengine.AppID(ctx)

    cfg, err := s.Projects.GetRemoteConfig(projectID).Do()
    if err != nil {
        log.Errorf(ctx, "Failed to call Firebase remote config API: %v", err)
        return nil, err
    }

    return cfg, nil
}

代码使用项目 ID 形成其路径;在阅读了 lib 代码后,我注意到它从该路径中丢失了 /projects/ ;所以我只是将它添加到我的项目 ID 之前并且它有效 ;-) 至少直到他们修复它并且我的代码停止工作..

希望这对某人有所帮助。