6

我正在使用带有 NodeJS的Google Cloud Pub Sub API ,如此所述。我正在使用 Heroku 来运行我的服务器。

Node JS + Pub Sub 页面上的示例代码要求我指定文件的路径:

pubsub = gcloud.pubsub({
    projectId: 'my-project',
    keyFilename: '/path/to/keyfile.json'
});

我通常使用 Heroku 的配置变量来存储秘密和 API 密钥,但在这种情况下,GCloud API 似乎需要我指定文件的路径。因此,我需要将文件签入 Heroku,而不是我的 GitHub 存储库。

我尝试了以下方法:将.gitignore 文件推送到特定的远程以及如何将我的应用程序上传到 github 但删除敏感的授权信息?但问题是,一旦我强制添加 ( git add -f keyfile.json) json 文件并从中进行提交并创建一个新分支,我就无法将该提交推送到 Heroku,因为当我这样做时git push heroku master,它会说Everything is up to date。无论如何,这看起来非常混乱。必须有一种更简洁的方式让 Google Cloud 与 Heroku 一起工作。

我该怎么办?

4

2 回答 2

3

由 GoogleCloudPlatform 的可爱人士回答:https ://github.com/GoogleCloudPlatform/gcloud-node/issues/761

文档中的代码示例中没有提到它,但是您可以添加一个凭据对象并将其传递给您的配置。凭证对象可以读取环境变量。

更多信息在这里:https ://googlecloudplatform.github.io/gcloud-node/#/authorization 。
更新链接: https ://googleapis.dev/nodejs/pubsub/latest/global.html#ClientConfig

于 2015-07-30T14:34:10.417 回答
0

不是针对nodejs,而是针对GO(GOLANG)将每个字段值作为环境变量中的一个单独的键,然后您需要执行类似的操作,创建结构,转换为json(替换private_key中的每个\\nto\n),输入选项。WithCredentialsJSON

type credentialsData struct {
    Type                    string `json:"type"`
    ProjectId               string `json:"project_id"`
    PrivateKeyId            string `json:"private_key_id"`
    PrivateKey              string `json:"private_key"`
    ClientEmail             string `json:"client_email"`
    ClientId                string `json:"client_id"`
    AuthUri                 string `json:"auth_uri"`
    TokenUri                string `json:"token_uri"`
    AuthProviderX509CertUrl string `json:"auth_provider_x509_cert_url"`
    ClientX509CertUrl       string `json:"client_x509_cert_url"`
}

func firebase_init() *firebase.App {
    backSlashFix := strings.Replace(os.Getenv("FIREBASE_PRIVATE_KEY"), "\\n", "\n", -1)
    json_cred := &credentialsData{
        Type:                    os.Getenv("FIREBASE_ACCOUNT_TYPE"),
        ProjectId:               os.Getenv("FIREBASE_PROJECT_ID"),
        PrivateKeyId:            os.Getenv("FIREBASE_PRIVATE_KEY_ID"),
        PrivateKey:              backSlashFix,
        ClientEmail:             os.Getenv("FIREBASE_CLIENT_EMAIL"),
        ClientId:                os.Getenv("FIREBASE_CLIENT_ID"),
        AuthUri:                 os.Getenv("FIREBASE_AUTH_URI"),
        TokenUri:                os.Getenv("FIREBASE_TOKEN_URI"),
        AuthProviderX509CertUrl: os.Getenv("FIREBASE_AUTH_PROVIDER_X509_CERT_URL"),
        ClientX509CertUrl:       os.Getenv("FIREBASE_CLIENT_X509_CERT_URL"),
    }

    bytes, e := json.Marshal(json_cred)
    if e != nil {
        panic(fmt.Errorf("Could not create json from credentials struct", e))
    }
    opt := option.WithCredentialsJSON([]byte(string(bytes)))
    app, err := firebase.NewApp(context.Background(), &firebase.Config{ProjectID: "<your project id>"}, opt)
    if err != nil {
        panic(fmt.Errorf("error initializing app: %v", err))
    }

    return app
}
于 2019-09-17T22:33:54.563 回答