使用Go对远程Config Rest API的服务帐户进行身份验证

时间:2018-07-14 01:39:21

标签: firebase go firebase-remote-config google-client

Over here Firebase文档说明了如何检索向token发出请求所需的Remote Config Rest API

它提供了 Python,Java和Node.js 的示例代码。因为没有 Go 的代码,它会发送我Google Client Library (for Go)。您也许能够理解为什么我在那里迷路了……

示例使用GoogleCredential in JavaServiceAccountCredentials in Pythongoogle.auth.JWT in Node.js。我找不到任何here。我不知道为什么没有明确的命名约定。

我发现了

firebaseremoteconfig-gen.go:代码看起来已经实现了 Firebase文档页面试图“手动”实现的功能。比较:docpackage

帮助

由于"Usage example" of the package突然结束并且与广泛相反,我不知道如何使用它。

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

firebaseremoteconfigService, err := firebaseremoteconfig.New(oauthHttpClient)

我不知道从哪里可以得到oauthHttpClient。存储库中有一个oauth2包,但我遇到了the same problem

oauth2Service, err := oauth2.New(oauthHttpClient)

我再次需要oauthHttpClient,所以这不是解决方案。
http.Client可以是任何东西,但是我需要使用shown in the three example snippets here之类的service-account.json文件进行身份验证。

标签说明

我希望有人曾经将 Firebase Remote 配置 Go 集成在一起,有人知道 Google如何客户端API 身份验证起作用,或者某人对 Go 足够满意,可以了解其用法。

2 个答案:

答案 0 :(得分:4)

使用google API进行身份验证的主要方法有两种,请参见此处:

Link to docs

记录的方式是“三足OAuth”,“使用API​​密钥”,最后是“服务帐户”。

通过问题中包含的链接;您正在查看“服务帐户”的Python / Java / Node示例。

在使用中使用服务帐户

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

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

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

以其他语言链接的示例使用“服务帐户json密钥文件”。

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

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

链接的其他语言示例的等效语言为;

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("...")

答案 1 :(得分:0)

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

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的前缀,然后它就可以工作了;-)至少要等到他们解决了这个问题,然后我的代码才能停止工作。.

希望这对某人有帮助。