【问题标题】:Confused about how to properly use secret keys对如何正确使用密钥感到困惑
【发布时间】:2015-11-29 20:37:38
【问题描述】:

因此,在我寻求集成 Stripe 的过程中,我发现自己对如何正确使用密钥和环境变量感到困惑。据我了解,我不想在任何公共场所明确包含我的密钥,而应该使用环境变量。但是当我用 ENV 代替实际的硬编码密钥时,它似乎不起作用。我做错了什么,但是什么?这就是我所拥有的。在我的 secret.yml 文件中:

development:
  secret_key_base: xxxxxxxxxxxxxxx

  secret_key: sk_test_JlKC4V7nmCQ0sE4iNAVyoAxA
  publishable_key: pk_test_KfCg1YmVXwBYyEdPEWnfibF8

  stripe_live_publishable_key: pk_live_pxxxxxxxxxxxxxx
  stripe_live_secret_key: sk_live_jxxxxxxxxxxxxx

test:
  secret_key_base: a38exxxxxxxxxxxxxxxx

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
#test
  secret_key: <%= ENV["SECRET_KEY"] %>
  publishable_key: <%= ENV["PUBLISHABLE_KEY"] %>
# live
  stripe_live_publishable_key: <%= ENV["STRIPE_LIVE_PRODUCTION_KEY"] %>
  stripe_live_secret_key: <%= ENV["STRIPE_LIVE_SECRET_KEY"] %>

在 /initialize/stripe.rb 我有:

Rails.configuration.stripe = {
   :publishable_key => ENV['PUBLISHABLE_KEY'],
   :secret_key      => ENV['SECRET_KEY']
}

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

在我的付款表格中,我有一行: Stripe.setPublishableKey('&lt;%= 'sk_test_JlKC4V7nmCQ0sE4iNAVyoAxA'%&gt;');

它是这样工作的,但除非我有误解,否则它是不安全的(嗯,现在它只是一个测试密钥,但是当我使用实时密钥进行生产时我需要知道这一点)。然而,当我尝试使用时:

Stripe.setPublishableKey('&lt;%= ENV['PUBLISHABLE_KEY'] %&gt;');

我得到错误: Uncaught Error: You did not set a valid publishable key. Call Stripe.setPublishableKey() with your publishable key.

或者当我尝试时:

Stripe.setPublishableKey('&lt;%= :publishable_key %&gt;');

我在控制台中收到错误 401 (Unauthorized)

我应该如何使用 ENV[KEY],这样我就不需要把我的密钥写出来了?

更新: 这是我的密钥最公开的表单:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  <title>Contribution Form</title>

  <!-- The required Stripe lib -->
  <script type="text/javascript" src="https://js.stripe.com/v2/"></script>

  <!-- jQuery is used only for this example; it isn't required to use Stripe -->
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

  <script type="text/javascript">
    // This identifies your website in the createToken call below
    Stripe.setPublishableKey('STRIPE_TEST_PUBLISHABLE_KEY'); //<====How should this line look?

    var stripeResponseHandler = function(status, response) {
      var $form = $('#payment-form');

      if (response.error) {
        // Show the errors on the form
        $form.find('.payment-errors').text(response.error.message);
        $form.find('button').prop('disabled', false);
      } else {
        // token contains id, last4, and card type
        var token = response.id;
        // Insert the token into the form so it gets submitted to the server
        $form.append($('<input type="hidden" name="stripeToken" />').val(token));
        // and re-submit
        $form.get(0).submit();
      }
    };

    jQuery(function($) {
      $('#payment-form').submit(function(e) {
        var $form = $(this);

        // Disable the submit button to prevent repeated clicks
        $form.find('button').prop('disabled', true);

        Stripe.card.createToken({
            number: $('.card-number').val(),
            cvc: $('.card-cvc').val(),
            exp_month: $('.card-expiry-month').val(),
            exp_year: $('.card-expiry-year').val()}, stripeResponseHandler);

        // Prevent the form from submitting with the default action
        return false;
      });
    });
  </script>
</head>
<body>

<!--  form -->
<div class="container">
    <div class="row Row one">
        <div class="col-sm-12 col-md-10">
        <h1>Make your contribution</h1>
           <%= form_for @project, url: project_charges_path, :html => {:id => "payment-form"}, method: 'post' do |f| %>

                <%= f.hidden_field :user_id, :value => current_user.id %>
                <%= f.hidden_field :@project_id, :value => @project.id %>


                <div class= "field">
                  <%= label_tag :card_number, "Credit Card Number" %><br>
                  <%= text_field_tag :card_number, nil, name: nil, class: ' card-number form-control', :required => true %><br>
                </div>

                <div class= "field">
                  <%= label_tag :card_code, "Security Code (cvc)" %><br>
                  <%= text_field_tag :card_code, nil, name: nil, class: 'card-cvc form-control', :required => true %><br>
                </div>

                <div class= "field">
                  <%= label_tag :card_month, "Expiration" %>
                  <%= select_month nil, {add_month_numbers: true}, {name: nil, class: "card-expiry-month"} %>
                  <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, class: "card-expiry-year"}%>
                </div>


                <div class= "field">
                    <%= label_tag :amount, "Amount" %><br>
                    <%= text_field_tag :amount %> 
                </div> 

                <div class= "field">
                    <%= label_tag :comments, "Add a comment?" %><br>
                    <%= text_area_tag :comments %> 
                </div>                 

                <div class= "actions">
                  <%= f.submit 'Submit', :class => 'contribution-submit' %>
                </div>

          <div id="stripe_error">
              <noscript>JavaScript is not enabled and is required for this form. First enable it in your web browser settings.</noscript>
          </div>

          <% end %> 
        </div>
    </div>
    <!-- <div class="row"></div> -->
</div>


</body>
</html>

【问题讨论】:

    标签: ruby-on-rails environment-variables stripe-payments


    【解决方案1】:

    生产环境变量与应用程序服务器的关系比与 Rails 应用程序的关系更大。在我看来,您所做的一切似乎都是正确的,只需在生产模式下设置变量即可。

    对于 Heroku:

    heroku config:set STRIPE_PERISHABLE_KEY=<your key here>
    heroku config:set STRIPE_SECRET_KEY=<your key here>
    

    对于乘客(nginx 或 apache):

    在您的带有乘客的服务器/站点定义中,您可以添加乘客环境变量。

    passenger_env_var STRIPE_PERISHABLE_KEY '<your key here>';
    passenger_env_var STRIPE_SECRET_KEY '<your key here>';
    

    *请注意,对于 Apache,您在键和值之间使用 = 符号,并且值周围没有引号。

    【讨论】:

    • 感谢您的回答!您能否澄清在公共文件中引用密钥的正确方法是什么?正如我提到的Stripe.setPublishableKey('&lt;%= 'sk_test_JlKC4V7nmCQ0sE4iNAVyoAxA'%&gt;') 有效,但似乎不安全。我希望你能够使用`Stripe.setPublishableKey('')`或者Stripe.setPublishableKey('&lt;%= :publishable_key %&gt;')
    • 您已经以正确的方式完成了。您的 secrets.yml 和您的条带初始化程序看起来应该是这样。我认为您只是缺少 prod env 中的 env 变量。
    • 好的,我将按照您的建议将它们设置在终端中,谢谢:)
    • 您不会在表单中显示密钥。我不确定我是否理解您要执行的操作。你可以看看这个教程。它可能会给你一个更好的从头到尾的条纹概念。祝你好运::: stillriversoftware.com/blog/…
    • @HolyMoly 解决您的担忧,即以公开的形式公开您的密钥似乎不安全;这实际上并不是一种不安全的做法。这就是 public 密钥的工作原理。 “公钥可以发送给任何人,只要私钥只在该用户的控制之下,它就是安全的。”在此处了解更多信息:workendtech.com/pgp-encryption-basic-overview
    【解决方案2】:

    ENV 变量通过终端设置。这不是“最佳实践”,但我在 .bash_profile 中设置了密钥。还有一些 gem 可以为您管理环境变量。

    这是一个流行的实现 yaml 的:

    https://github.com/laserlemon/figaro

    这是一个将密钥添加到 .bash_profile 的示例

    ## Work Keys
    export STRIPE_KEY="pk_test_somekey"
    export STRIPE_SECRET="sk_test_somekey"
    

    然后在 ruby​​ 中你可以像这样访问变量:

    ENV["STRIPE_KEY"]
    ENV["STRIPE_SECRET"]
    

    完成此操作后,您需要通过创建一个新的终端实例来刷新您的环境。所以退出终端并重新启动你的服务器!

    【讨论】:

    • 所以如果我在终端中设置它们,当我部署到 heroku 并进入生产模式时我需要做任何事情吗? Stripe 文档说要设置这些文件,因为我有它们,我不确定为什么这不起作用...我将在终端中进行更多关于设置 env vars 的谷歌搜索
    • 在heroku中你需要单独添加它们。您可以在 heroku.com 上执行此操作。或者您可以再次通过终端添加它们。像这样:heroku config:set STRIPE_KEY=pk_test_somekey
    • 酷,让我试一试。谢谢!你认为我需要删除或弄乱我已经拥有的文件吗?会不会有冲突?如果我确实删除或更改了它们,因为 Stripe 期待它们,你预计会有任何冲突吗???
    • 删除除您的 stripe.rb 之外的所有内容。删除您编写密钥的所有其他地方。
    • 所以我删除了 secret.yml 文件中的密钥(实际上我只是将它们注释掉),我单独留下了 stripe.rb 文件,并留下了引用表单中密钥的行(我认为那里也需要它)单独使用,它对我不起作用。我并不是说我做对了,但我尝试过。大声笑
    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2021-06-15
    相关资源
    最近更新 更多