在生产中使用 dotenv,还是将 env 变量传递给 js/js.erb?并尝试使用凭据

Posted

技术标签:

【中文标题】在生产中使用 dotenv,还是将 env 变量传递给 js/js.erb?并尝试使用凭据【英文标题】:Using dotenv in production, or passing env variables to js/js.erb? and attempt with credentials 【发布时间】:2019-08-17 16:54:39 【问题描述】:

我正在尝试将我的条带可发布密钥的 ENV 变量传递给 Connect 的 stripe.js 文件。

Dotenv 宝石:

gem 'dotenv-rails', groups: [:development, :test, :production]

我将它添加到我的 dotenv gem .env 文件中:

STRIPE_PUBLISHABLE_KEY=pk_test_xxxxxxxxxx
STRIPE_SECRET_KEY=sk_test_xxxxxxxxxx

然后添加到我的 stripe.js.erb 文件中:

var stripe = Stripe("<%= ENV['STRIPE_PUBLISHABLE_KEY']%>");

将 stripe.js 更改为 stripe.js.erb 在本地工作,但 ENV 似乎在生产中不起作用。在 Heroku 变量中,我设置了它。如果我直接在 stripe.js/.js/erb 中传递密钥,它会起作用,所以无论如何,ENV 在生产期间不起作用。

即使我将代码放入带有标签的视图中,除非我直接将密钥传递进去,否则它将无法工作。

我在 herokus 方面没有收到任何错误。

我也尝试过使用凭据:

stripe:
  stripe_publishable_key: pk_test_x
  stripe_secret_key: sk_test_x

在我的 stripe.js/.js.erb 文件中有这个:

  var stripe = Stripe('<%= Rails.application.credentials.dig(:stripe, :stripe_publishable_key) %>');

(我使用这种精确的格式进行主动存储和工作 并尝试:

 var stripe = Stripe('<%= Rails.application.credentials.stripe[:stripe_publishable_key] %>');

有了这些,我在推送到 heroku 时收到以下错误:

NoMethodError: nil:NilClass 的未定义方法 `[]'

问题:如何将 ENV 变量传递给生产环境?

使用 .erb 解决了这个问题,但现在问题是 ENV 文件未达到生产。

【问题讨论】:

除了 .env dotenv 问题.... 显然凭据与 Atom 有问题,这就是我使用的??? ***.com/questions/48539408/… 你怎么知道它在生产中不起作用?你检查过渲染的 JS 吗?此外,这几乎与您的其他问题***.com/questions/55370201/… 重复...最好不要针对同一个问题提出多个问题 Using Dotenv env for stripe "Error: Invalid API Key provided: <%=***['******_***********_***']%>"的可能重复 @maxpleaner 因为 ENV 在生产中没有通过。条纹信用卡条目没有出现......在本地它出现了。但在生产中我直接在它工作的代码中使用密钥。不是 JS 没有被渲染,而是 ENV 没有被传递到生产中——这是我的假设。 您提交并推送您的.env 文件了吗? 【参考方案1】:

如果您记得预编译资产(我在处理 heroku 时经常忘记),则需要将 js.erb 文件显式添加到预编译列表中(SO post、more detailed blog post)

不过,在这种情况下,您实际上不需要将其包装在变量中。可以(应该)包含可发布的密钥以识别您的 Stripe 帐户,并且插值将以纯文本形式发送(您通常希望通过使用 ENV 变量来避免),因此您可以完全跳过 interp 步骤。

从 cmets 编辑: 您需要验证 env 键实际上是在 Heroku 上设置的。有两种检查方式:

登录 CLI 并检查 还可以通过仪表板中的设置进行检查(this 提供了如何同时执行这两个操作的示例)

如果你在编译后的 JS 中得到一个空字符串,那么这至少表明 ERB 正在被处理,所以错误很可能是没有什么可以插值的。

重申没有理由隐藏可发布的密钥(这就是为什么它被称为以及为什么文档以明文形式传递它)。此外,将其放入插入文本的 ENV 并没有隐藏任何内容。

【讨论】:

我的资产中已经有Rails.application.config.assets.precompile &lt;&lt; '*.js' Rails.application.config.assets.precompile &lt;&lt; '*.js.erb' 看下投递的JS文件,插值是否正确? 我很困惑。所以我在使用 Stripe Elements 并在 stripe.js 中:stripe.com/docs/stripe-js/elements/quickstart 我需要在 js 文件中传递可发布密钥。还有其他方法吗? 我真的不知道这意味着什么。但是当我签入 Sources 时,JS 文件正在渲染并通过。我的假设是,如果 ENV 或凭据通过密钥,它将起作用.....idk 好吧,最后是因为我在 heroku 集中设置了“PUBLISHABLE KEY”,但在 .env 和凭据中设置了“STRIPE_PUBLISHABLE_KEY”......哇,4 小时后。但现在我担心的是,即使这样,我仍然可以在源代码中看到测试可发布密钥。如果我能看到它,其他人不能吗?如果我去生活,它会消失吗,我现在不明白【参考方案2】:

我认为您在使用凭证方法时忘记在 Heroku 应用程序中设置 RAILS_MASTER_KEY 环境变量。从您的代码库中为它分配 master.key 的内容。

【讨论】:

以上是关于在生产中使用 dotenv,还是将 env 变量传递给 js/js.erb?并尝试使用凭据的主要内容,如果未能解决你的问题,请参考以下文章

如何在开发和生产中设置 dotenv?

process.env.NODE_ENV === "开发" 即使在生产中

您应该使用 Babel 配置中的 `env` 部分在生产中禁用 react-transform-hmr

使用 Python 和 dotenv 更改保存在 .env 文件中的环境变量

在生产中禁用 graphiql

dotenv 是什么 怎么使用