暂存环境:密码保护除webhook之外的所有内容

时间:2014-03-11 20:34:29

标签: ruby-on-rails ruby heroku middleware staging

对于暂存,我想密码保护所有内容,所以我添加了下面的代码。但是,我该如何编辑它以便它会跳过webhook控制器,这样我仍然可以在登台时测试入站电子邮件?

  config.middleware.insert_after(::Rack::Lock, "::Rack::Auth::Basic", "Staging") do |u, p|
    [u, p] == [ENV["STAGING_USERNAME"], ENV["STAGING_PASSWORD"]]
  end

3 个答案:

答案 0 :(得分:1)

我认为你不能用`Rack :: Auth :: Basic'做到这一点。但是,查看source,您似乎可以创建自己的简单身份验证机制,这需要额外的选项。

Rack::Auth::Basic方法外,它与call相同。使用以下内容在authenticate_excluding.rb中创建名为app/middleware的文件:

class AuthenticateExcluding < ::Rack::Auth::Basic

  def initialize(app, options={}, &authenticator)
    @excluded_paths = options[:exclude]
    super(app, options[:realm], &authenticator)
  end

  def call(env)
    if @excluded_paths && @excluded_paths.include?(env['PATH_INFO'])
      return @app.call(env)
    end
    super
  end
end

您现在可以将其用于:

config.middleware.insert_after(::Rack::Lock, "AuthenticateExcluding", excluding: ["/webhooks/service", "/other_hook"]) do |u, p|
  [u, p] == [ENV["STAGING_USERNAME"], ENV["STAGING_PASSWORD"]]
end

那应该有用。如果您还想启用领域(之前的“Staging”参数),您还可以将realm: "Staging"添加到选项哈希。

答案 1 :(得分:0)

使用rack/private很容易,因为您可以像这样指定一个例外:

use Rack::Private, :code => ENV["STAGING_PASSWORD"] do
  except '/webhooks/service'
end

如果需要,您也可以指定HTTP方法。

唯一的问题是您没有用户名和密码,只有密码。我不知道这是否符合您的需求?

答案 2 :(得分:0)

我发现只需在webhook网址中加入登台用户名和密码,我就可以轻松解决问题。

If this URL requires HTTP Basic Auth, enter http://USERNAME:PASSWORD@YOUR_URL into the url field." - Codeship.io