2011-08-09 13 views
1

Sinatraアプリケーション内の保護された一連のURL(管理セクション)の後ろにリダイレクトするときに、ちょっと遭遇しました。たぶん愚かな間違いですが、私はオンラインで役立つものを見つけていません。SinatraのPost/Redirect Auth問題

これは、ユーザーが新しいイベントを作成できるヘルパーが示すように、パスワードで保護された領域用です。ユーザが初めて管理者にアクセスしようとすると、パスワードの入力を求められ、その後のページが残されます。私が持っている問題は、成功した新しいイベントが行われた後にアプリケーションがリダイレクトしようとすると、ユーザーは自分自身を再認証しなければならないということです。

これは、削除と編集のプロセスにも当てはまります。リダイレクトが試行されると、ユーザーは常にプロンプ​​トを表示します。私はどんな質問/ヘルプは

helpers do 
    def protected! 
     unless authorized? 
     response['WWW-Authenticate'] = %(Basic realm="Restricted Area") 
     throw(:halt, [401, "Not authorized\n"]) 
     end 
    end 

    def authorized? 
     @auth ||= Rack::Auth::Basic::Request.new(request.env) 
     @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ['admin', 'admin'] 
    end 
end 
... 
get "/admin/events/:id" do 
    protected! 
    conf = Conference.where(:_id => params[:id]).first 
    not_found unless conf 
    haml :admin_event_edit, :layout => :admin_layout, :locals => { :event => conf } 
end 

post "/admin/events/new/" do 
    protected! 
    conf = Conference.new(params[:event]) 
    if conf.save! 
     redirect "/admin/events/" 
    else 
     "Something went horribly wrong creating the new event, heres the form contents #{params.inspect}" 
    end 
end 

get "/admin/events/" do 
    protected! 
    haml :admin_events, :layout => :admin_layout, :locals => { :our_events => Conference.where(:made => true).order_by(:start_date.asc).limit(15), :other_events => Conference.where(:made => false).order_by(:start_date.asc).limit(15)} 
end 

答えて

0

をいただければ幸いです、ここのコードだ、とにかく異なるHTTPコードのために、しかし、無駄

に2つ目のパラメータでを渡して試してみたこれだけですSafariで起こっている?

私は上記のコードを使用しました。これはSafari、Chrome、FireFoxでのみ再認証されます。

「私のユーザ名/パスワードを覚えておいてください。」とチェックしないと、SafariはヘッダーにAuthorizationなしで後続のリクエストを送信します(ヘッダを見るための素晴らしいツールなどはCharlesです)。あなたがそれをチェックすると、AppleはヘッダーにAuthを正しく送信し、Safariを終了しても、再起動時にAuthを送信することを覚え続けるでしょう。

だから、Appleはあなたが愚かではないというのです:)

+0

これを回避するには、ボーナスはクッキーであることクッキーベースの認証http://ididitmyway.heroku.com/past/2011/2/22/really_simple_authentication_in_sinatra/を使用することができますHTTP基本認証が終了したときにのみ(またはSafariのKeychain Accessの場合のみ)タイムアウトするように設定できます。 – kreek

+0

ああ、恥ずかしいこと、それを見てくれてありがとう、ええ、それはクロムとFFで扱われる作品です。唯一の内部なので、少し時間をかけて考えてみてください。 – redroot

関連する問題