对于暂存,我想密码保护所有内容,所以我添加了下面的代码。但是,我该如何编辑它以便它会跳过webhook控制器,这样我仍然可以在登台时测试入站电子邮件?
config.middleware.insert_after(::Rack::Lock, "::Rack::Auth::Basic", "Staging") do |u, p|
[u, p] == [ENV["STAGING_USERNAME"], ENV["STAGING_PASSWORD"]]
end
答案 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