如何在 Ruby on Rails 中为我的开发和生产环境设置不同的 api 密钥?

Posted

技术标签:

【中文标题】如何在 Ruby on Rails 中为我的开发和生产环境设置不同的 api 密钥?【英文标题】:How do I set different api keys for my development and production environments in Ruby on Rails? 【发布时间】:2012-08-11 09:47:37 【问题描述】:

我正在做一些涉及 Stripe API 的开发。在我的开发环境中,我正在使用我的条带测试密钥。在生产中,我使用的是真正的 api 密钥,这样我当然可以处理真实的交易。

我目前只是在部署到生产环境之前立即更改测试 api 密钥;这感觉不是很好。我很确定可行的策略是使用 gitignore 创建一个开发分支(忽略加载 api 密钥的初始化程序),然后在部署之前将其与主分支合并;这样,api 密钥在各自的环境中总是正确的。不过我不太喜欢这种方法。是否有某种方法可以在某处配置这些 api 密钥,以便应用程序只知道在 dev/prod 中使用哪一个?

【问题讨论】:

【参考方案1】:

给这只猫剥皮的方法有很多。

快速简单,看Rails.env

它将返回服务器运行的环境。 您只需要相应地设置密钥。

我真正推荐的方法是使用yaml 文件或使用Rails.application.config 创建应用程序配置变量

config/environments/development.rb

config.api_key = "my dev api key"

config/environments/production.rb

config.api_key = "my prod api key"

访问您的密钥

MyApp::Application.config.api_key

查看question 了解其他示例。

【讨论】:

【参考方案2】:

我更喜欢使用yetting。

虽然将 API 密钥添加到环境文件中可以完成工作,但将它们添加到单独的文件中对我来说似乎是一种更简洁和抽象的方式。

一旦安装了 gem。你可以在config目录下创建一个yetting.yml文件。

development:
  facebook_app_id: xxxxxx
staging:
  facebook_app_id: xxxxxx
production:
  facebook_app_id: xxxxxx

【讨论】:

【参考方案3】:

这就是我的做法:

在 config/initializers/stripe.rb 中

if(Rails.env == 'development' || Rails.env == 'staging')
  Stripe.api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
  STRIPE_PUBLIC_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
elsif(Rails.env == 'production')
  Stripe.api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
  STRIPE_PUBLIC_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
end

【讨论】:

这行得通,但它不会遵循最佳实践:当您将代码提交到共享存储库时会发生什么?您的整个团队都可以使用生产密钥。生产密钥应在环境 (ENV) 中设置。【参考方案4】:

在 Rails 4.1 中,我们有 config/secrets.yml 文件,因此您可以在其中设置 api 密钥,如下所示:

development:
  secret_key_base: 'xxx'
  publishable_key: xxx
  secret_key: xxx
production:
  secret_key_base: 'xxx'
  publishable_key: xxx
  secret_key: xxx

在您的 stripe.rb 文件中,您可以这样做:

Rails.configuration.stripe = 
  :publishable_key => Rails.application.secrets.publishable_key,
  :secret_key      => Rails.application.secrets.secret_key


Stripe.api_key = Rails.configuration.stripe[:secret_key]

【讨论】:

以上是关于如何在 Ruby on Rails 中为我的开发和生产环境设置不同的 api 密钥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby on Rails 中为帖子添加标签

chardinjs 不在 ruby​​ on rails 中工作

如何在 ruby​​ on rails 中更改路线?

使用 RESTful 身份验证插件进行 Ruby on Rails 功能测试

如何以可扩展的方式部署 [Ruby on Rails] 站点?

如何让 XAMPP 的 MySQL 和 Ruby on Rails 在我的 Mac 上协同工作?