Over here Firebase文档说明了如何检索向token发出请求所需的Remote Config Rest API。
它提供了 Python,Java和Node.js 的示例代码。因为没有 Go 的代码,它会发送我到Google Client Library (for Go)。您也许能够理解为什么我在那里迷路了……
示例使用GoogleCredential
in Java,ServiceAccountCredentials
in Python和google.auth.JWT
in Node.js。我找不到任何here。我不知道为什么没有明确的命名约定。
firebaseremoteconfig-gen.go
:代码看起来已经实现了 Firebase文档页面试图“手动”实现的功能。比较:doc,package。
由于"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 足够满意,可以了解其用法。
答案 0 :(得分:4)
使用google API进行身份验证的主要方法有两种,请参见此处:
记录的方式是“三足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的前缀,然后它就可以工作了;-)至少要等到他们解决了这个问题,然后我的代码才能停止工作。.
希望这对某人有帮助。