1

すべてのリクエストをインターセプトし、許可された IP からのものであることを確認するレール用のカスタム ミドルウェアを作成しました。

これは現在、次のようになっています。

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

このコードの問題は、ブラウザで http 認証ウィンドウをトリガーする方法が見つからないように見えることですこれを確認しましたが、これがどのように行われるかについての明確な兆候は見られませんでした。

正しい方向に向けてください。

4

3 に答える 3

1

WWW-Authenticateヘッダーを指定する必要があります。を参照してください

else私は、あなたの中で、あなたがするだろうと仮定します:

[401, {'WWW-Authenticate' => 'Basic realm="Application"', "Content-Type" => "text/html"}, ["Not Authorized on this environment."]]
于 2013-10-15T20:44:56.420 に答える
1

私はあなたのコードをテストしていませんが、「禁止」を意味する 403 で返信しているようです。つまり、現在ログインしているユーザーには、このリソースにアクセスする権限がありません。

RFC から ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html )

サーバーは要求を理解しましたが、要求を満たすことを拒否しています。承認は役に立たず、要求を繰り返すべきではありません。リクエスト メソッドが HEAD ではなく、サーバーがリクエストが実行されなかった理由を公開したい場合、拒否の理由をエンティティに記述する必要があります。サーバーがこの情報をクライアントに提供したくない場合は、代わりにステータス コード 404 (Not Found) を使用できます。

代わりに、401 を使用する必要があり、現在ログインしているユーザーがリソースにアクセスできない場合にのみ 403 で応答する必要があります。

于 2013-05-16T01:23:29.653 に答える