1

現在、資格情報の検証に使用される ApplicationController に before_filter があります。また、URL に直接 (つまり、ブラウザーのログイン フォーム/セッションからではなく、スクリプトから) アクセスするときに、ユーザーの資格情報を確認できるようにしたいと考えています。GET 要求を介してユーザー資格情報を受け入れることに問題はありますか?

application_controller.rb

before_filter :login_required

def login_required
    reset_session if session[:last_seen] < Rails.configuration.admin_timeout.minutes.ago rescue nil
    return true if session[:user]
    if (!params[:login].nil? && !params[:password].nil?) && session[:user] = User.authenticate(params[:login], params[:password])
        return true
    else
        render :nothing => true, :status => 401
        return false
    end
    flash[:alert] = 'Please login to continue'
    redirect_to login_url and return false
end

それが受け入れられない場合は、特定の「安全な」コントローラー アクションでのみこれを実行できるようにしたいと考えています。たとえば、次のようになります。

product_controller.rb

before_filter :do_something
permit_login_via_get :only => [:index]

def index
    # Do some stuff in here. This should be accessible via http://mydomain.com/products?login=admin&password=yeahlikeidtellyouthat
end

したがって、「permit_login_via_get」メソッドが機能するように、login_requred 関数を変更する必要があります。

4

2 に答える 2

1

さて、私はそれを考えて、アプリケーションごとにAPIキーを作成し、Net :: HTTPリクエストを使用して、APIキーを含むカスタムヘッダーを設定するのが最善であると判断しました。そうすれば、URLを介して送信されるユーザー資格情報はありません。さて、この方法について「安全」であるかどうか、またはそれを安全にするために私がしなければならないことについては、別のことです。しかし、これが私がこれまでに行った方法であり、それは機能しているようです:


application.rb(マネージャーアプリケーション)

# API Keys
config.api_key = "somelongstringofcharacters"
config.pos_api_key = "anotherlongstringofcharacters"
config.website_api_key = "yetANOTHERlongstringofcharacters"

POSアプリとWebサイトアプリのapplication.rbは、上記の例と同様です。


application_controller.rb(すべてのアプリケーション)

before_filter :login_required

def login_required
    reset_session if session[:last_seen] < Rails.configuration.admin_timeout.minutes.ago rescue nil
    return true if session[:user]
        unless request.headers["X-API-Key"].nil?
        if request.headers["X-API-Key"] == Rails.configuration.api_key
            return true
        else
            render :nothing => true, :status => 401
            return false
        end
        end
    flash[:alert] = 'Please login to continue'
    redirect_to :controller => :users, :action => :login
    return false
end

このように、すべてのメソッドはプライベートであり(skip_before_filter:login_requiredを持つメソッドを除く)、フォームを使用してログインとパスワードの組み合わせを使用してセッションでログインした場合、または行ったリクエストに「正しいアプリケーションキーを持つX-API-Key"ヘッダー。

以下は、Managerアプリを介して実行されるRakeタスクの例です。login_requiredメソッドで保護されているPOSサーバーからJSONファイルを要求します。

desc "Test Task so that larger projects don't need to be run through"
task :testing => :environment do

    require "net/http"
    require "uri"

    url = URI.parse("http://myposdomain/items.json?all=true&category=Wines")
    req = Net::HTTP::Get.new(url.path)
    req.add_field("X-API-Key", Rails.configuration.pos_api_key)
    res = Net::HTTP.new(url.host, url.port).start do |http|
    http.request(req)
    end
    myposdomain_wines = res.body

end
于 2013-01-25T22:26:57.857 に答える
1

問題は、資格情報が URL で渡されるため、非常に目に見えて、おそらくユーザーのブラウザー履歴にもキャッシュされることです。

于 2013-01-25T21:14:15.033 に答える