首页 > 解决方案 > 访问/使用 Rails 凭据的挑战

问题描述

我一直在尝试访问我在 Rails 加密凭据中设置的 API 密钥。我使用 Vim 将密钥添加到文件中,并仔细检查了它们是否正确保存。

我添加config.require_master_key = true到我的测试、开发和生产文件中config/environments

但是当我尝试使用其中一个 API 密钥时,它会返回nil.

我的凭据设置如下:

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: 1234567890

stripe:
  development:
    stripe_public_key: pk_test_1234567890
    stripe_secret_key: sk_test_1234567890

stripe:
  test:
    stripe_public_key: pk_test_1234567890
    stripe_secret_key: sk_test_1234567890
stripe:
  production:
    stripe_public_key: pk_live_1234567890
    stripe_secret_key: sk_live_1234567890

然后在我想使用它的文件中(new.html.erb)我试图访问脚本中的凭据。

const stripe = Stripe("<%= Rails.application.credentials.stripe.stripe_public_key %>")

但它不返回任何东西。

在深入研究 Stack Overflow 和 Rails 文档后,我尝试了其他几个版本/语法,但还没有任何工作。

也尝试过const stripe = Stripe("<%= Rails.application.credentials.stripe[Rails.env.to_sym][:stripe_public_key] %>"),但也没有运气。

当我运行服务器并在 Chrome 开发工具中查看脚本时,它只显示为const stripe = Stripe("")

值得注意的是,当我运行时rails credentials:show,凭据会正确打印到终端,因此它们确实存在。我一定只是错误地访问它们。

标签: ruby-on-railsrubyenvironment-variables

解决方案


正如@DennyMueller 在评论中指出的那样,问题在于文件中的“条纹”键被覆盖了,只有最后一个键最终存在于配置中。

无论如何,指出这不是 Rails 期望管理依赖于环境的凭据的方式是有用的。相反,您应该有单独的文件config/credentials/development.yml.encconfig/credentials/test.yml.enc,它们是通过运行生成的

rails credentials:edit --environment development
rails credentials:edit --environment test

因此,每个凭证文件都不应该将环境名称作为内部任何地方的键。


推荐阅读