Firebase 使用Go验证远程配置REST API的服务帐户
Firebase文档解释了如何检索请求所需的 它提供了Python、Java和Node.js的示例代码。因为没有“Go的代码”,它将我发送到。你也许能理解为什么我会在那里迷路 示例使用、和。我找不到这些。我不知道为什么没有明确的命名约定 我找到了 :代码看起来已经实现了Firebase文档页面试图“手动”实现的功能。比较: 帮助 因为结尾奇怪地突然,与粗放相反,我不知道如何利用它 如果有人能告诉我如何使用这个,我会得到帮助:Firebase 使用Go验证远程配置REST API的服务帐户,firebase,go,google-cloud-platform,firebase-remote-config,google-client,Firebase,Go,Google Cloud Platform,Firebase Remote Config,Google Client,Firebase文档解释了如何检索请求所需的 它提供了Python、Java和Node.js的示例代码。因为没有“Go的代码”,它将我发送到。你也许能理解为什么我会在那里迷路 示例使用、和。我找不到这些。我不知道为什么没有明确的命名约定 我找到了 :代码看起来已经实现了Firebase文档页面试图“手动”实现的功能。比较: 帮助 因为结尾奇怪地突然,与粗放相反,我不知道如何利用它 如果有人能告诉我如何使用这个,我会得到帮助: firebaseremoteconfigService, err :=
firebaseremoteconfigService, err := firebaseremoteconfig.New(oauthHttpClient)
我不知道从哪里可以获得OAuthTTPClient
。存储库中有一个oauth2
包,但我面对的是:
我再次需要OAuthTTPClient
,所以这不是一个解决方案。可以是任何内容,但我需要使用
服务帐户.json
文件进行身份验证,如
标签说明
我希望有人有过将Firebase Remote Config与Go集成的经验,有人知道谷歌客户端API如何进行身份验证,或者有人对Go很在行,可以了解其使用情况。使用谷歌API进行身份验证的主要方法有以下几种: 记录的方式有“三腿OAuth”、“使用API密钥”以及最后的“服务帐户” 从问题中包含的链接;您将看到“服务帐户”的Python/Java/Node示例 在go中使用服务帐户 您所指的
OAuthTTPClient
是一个http客户端,它将自动向请求附加身份验证信息
您可以使用此软件包创建一个:
以其他语言链接的示例使用“服务帐户json密钥文件”
使用下面链接的方法,您可以读取该密钥文件并创建一个jwt.Config
结构,该结构将允许您访问所需的客户端
其他语言示例的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前面加了一个前缀,它就可以工作了;-)至少在他们解决这个问题,我的代码停止工作之前
希望这对某人有所帮助 我永远不会从文档中提取它:)这对我自己的
Get
请求很有效。但是,我执行的请求失败,无法修复它们的请求。我确信它会失败,因为他们向http请求添加了太多内容(使用gensupport
)。我不想再为此烦恼了,因为我似乎找不到解决办法。我将自己控制JSON,这也很好。
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
}