Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 使用Go验证远程配置REST API的服务帐户_Firebase_Go_Google Cloud Platform_Firebase Remote Config_Google Client - Fatal编程技术网

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

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 :=

Firebase文档解释了如何检索请求所需的

它提供了Python、Java和Node.js的示例代码。因为没有“Go的代码”,它将我发送到。你也许能理解为什么我会在那里迷路

示例使用、和。我找不到这些。我不知道为什么没有明确的命名约定

我找到了 :代码看起来已经实现了Firebase文档页面试图“手动”实现的功能。比较:

帮助 因为结尾奇怪地突然,与粗放相反,我不知道如何利用它

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

firebaseremoteconfigService, err := firebaseremoteconfig.New(oauthHttpClient)
我不知道从哪里可以获得
OAuthTTPClient
。存储库中有一个
oauth2
包,但我面对的是:

我再次需要
OAuthTTPClient
,所以这不是一个解决方案。
可以是任何内容,但我需要使用
服务帐户.json
文件进行身份验证,如

标签说明
我希望有人有过将Firebase Remote ConfigGo集成的经验,有人知道谷歌客户端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
}