使用 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 Config 与 Go 集成的经验,有人知道 Google Client API authentication 是如何工作的,或者有人知道 Go 了解用法。
有几种使用 google API 进行身份验证的主要方法,它们记录在此处:
记录的方式是“三足 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 之前并且它有效 ;-) 至少直到他们修复它并且我的代码停止工作..
希望这对某人有所帮助。
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 Config 与 Go 集成的经验,有人知道 Google Client API authentication 是如何工作的,或者有人知道 Go 了解用法。
有几种使用 google API 进行身份验证的主要方法,它们记录在此处:
记录的方式是“三足 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 之前并且它有效 ;-) 至少直到他们修复它并且我的代码停止工作..
希望这对某人有所帮助。