在不使用环境变量的情况下读取 Heroku 上的秘密配置文件
Reading secret config file on Heroku without using env vars
我正在使用 Google Cloud Pub Sub API with NodeJS, as documented here。我正在使用 Heroku 运行 我的服务器。
Node JS + Pub Sub 页面上的示例代码要求我指定文件路径:
pubsub = gcloud.pubsub({
projectId: 'my-project',
keyFilename: '/path/to/keyfile.json'
});
我通常使用 Heroku 的配置变量来存储秘密和 API 密钥,但在这种情况下,GCloud API 似乎需要 我指定文件的路径。所以,我需要将文件签入 Heroku,而不是我的 GitHub 存储库。
我尝试了以下方法:Pushing .gitignore files to specific remote and How can I upload my application to github but remove sensitive authorization information? 但问题是,一旦我强制添加 (git add -f keyfile.json
) json 文件并从中提交并创建新的分支,我无法将该提交推送到 Heroku,因为当我执行 git push heroku master
时,它显示 Everything is up to date
。无论如何,这看起来很乱。必须有一种更简洁的方法来使 Google 云与 Heroku 一起工作。
我该怎么办?
由 GoogleCloudPlatform 上可爱的人们回答:https://github.com/GoogleCloudPlatform/gcloud-node/issues/761
文档中的代码示例中未提及,但您可以添加一个凭据对象并将其传递给您的配置。凭据对象可以读取环境变量。
此处有更多信息:https://googlecloudplatform.github.io/gcloud-node/#/authorization.
已更新 link: https://googleapis.dev/nodejs/pubsub/latest/global.html#ClientConfig
不适用于 nodejs,但适用于 GO (GOLANG),将每个字段值作为环境变量中的单独键,然后您需要执行类似的操作,创建结构,转换为 json (将 \n
替换为 \n
private_key),输入选项。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
}
我正在使用 Google Cloud Pub Sub API with NodeJS, as documented here。我正在使用 Heroku 运行 我的服务器。
Node JS + Pub Sub 页面上的示例代码要求我指定文件路径:
pubsub = gcloud.pubsub({
projectId: 'my-project',
keyFilename: '/path/to/keyfile.json'
});
我通常使用 Heroku 的配置变量来存储秘密和 API 密钥,但在这种情况下,GCloud API 似乎需要 我指定文件的路径。所以,我需要将文件签入 Heroku,而不是我的 GitHub 存储库。
我尝试了以下方法:Pushing .gitignore files to specific remote and How can I upload my application to github but remove sensitive authorization information? 但问题是,一旦我强制添加 (git add -f keyfile.json
) json 文件并从中提交并创建新的分支,我无法将该提交推送到 Heroku,因为当我执行 git push heroku master
时,它显示 Everything is up to date
。无论如何,这看起来很乱。必须有一种更简洁的方法来使 Google 云与 Heroku 一起工作。
我该怎么办?
由 GoogleCloudPlatform 上可爱的人们回答:https://github.com/GoogleCloudPlatform/gcloud-node/issues/761
文档中的代码示例中未提及,但您可以添加一个凭据对象并将其传递给您的配置。凭据对象可以读取环境变量。
此处有更多信息:https://googlecloudplatform.github.io/gcloud-node/#/authorization.
已更新 link: https://googleapis.dev/nodejs/pubsub/latest/global.html#ClientConfig
不适用于 nodejs,但适用于 GO (GOLANG),将每个字段值作为环境变量中的单独键,然后您需要执行类似的操作,创建结构,转换为 json (将 \n
替换为 \n
private_key),输入选项。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
}