从中间件内触发基本 HTTP 身份验证

bru*_*upm 1 ruby authentication rack middleware ruby-on-rails

我为 Rails 创建了一个自定义中间件,它将拦截所有请求并确保它来自授权的 IP,否则它应该提示输入基本的 http 身份验证用户/名密码。

目前看起来是这样的:

require 'net/http'

class AuthorizeEnvironment
  def initialize(app)
    @app = app
  end

  def call(env)
    if AppConstants.approved_doximity_ips.include?(env["REMOTE_ADDR"])
      @app.call(env)
    elsif authorized?(env)
      @app.call(env)
    else
      [403, {"Content-Type" => "text/html"}, ["Not Authorized on this environment."]]
    end
  end

  def authorized?(env)
    @auth ||= Rack::Auth::Basic::Request.new(env)
    @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ['username', 'password']
  end
end
Run Code Online (Sandbox Code Playgroud)

这段代码的问题是我似乎无法找到一种方法来触发浏览器上的 http 身份验证窗口。我查看了此内容,但没有看到任何明显的迹象表明这是如何完成的。

你能指出我正确的方向吗?

Las*_*ert 6

Rack::Auth::Basic直接使用并节省了验证部分:

class BasicAuth
  def initialize(app)
    @app = app
  end

  def call(env)
    if env["PATH_INFO"] == '/supersecret' # Any condition here
      auth = Rack::Auth::Basic.new(@app) do |u, p|
        u == username && p == password
      end
      auth.call env
    else
      @app.call env
    end
  end

  def username
    ENV["username"]
  end

  def password
    ENV["password"]
  end
end
Run Code Online (Sandbox Code Playgroud)

````