2012-03-31 1 views
2

私はHerokuでSinatraアプリを実行しています。私はユーザーのためにクッキーを正しく設定するのに非常に苦労しました。私は数日間の例とドキュメントを見てきましたが、問題を解決することはできません。私は電子メールとパスワードでユーザのログインをしたいと思っています。ログインが成功した場合は、設定した時間が経過した後に有効期限が切れるCookieを作成します。ユーザーがブラウザを閉じて再オープンした場合、または新しいコードをHerokuにプッシュした場合、ユーザーはログインしたままにしておきたい。私はそれがクッキーの通常の使用であると思うので、誰かがそれを手伝ってくれるなら、私はとても感謝しています。クッキーを使用してセッションを正しく開始し、保存し、ラックセッションを使用してSinatraアプリにアクセスする方法

ここに私はと思っています私はポスト '/ログイン'ルートを設定するはずです。

post '/login/?' do 

    #do_login is a helper method which checks if the user's credentials are correct 

    if do_login 
    use Rack::Session::Cookie, :key => 'rack.session', 
           :domain => 'www.Feistie.com', 
           :path => '/', 
           :expire_after => 2592000, 
           :secret => 'a_30_character_key', 
           :user_id => params[:user_id] 
    end 

end 

正しくても、私はそれを本当に理解していません。 :キーとは何ですか?私は仮定しています:ドメインは私のように私のウェブサイトに設定する必要があります。パス:パス?なぜですか:パスは '/'に設定されていますか?実際に私のRackアプリの秘密鍵を設定する場所はありますか?私は、クッキーのセキュリティがどのように機能するかについては完全にはわかりません。私はまた私が追加することができるかどうかわからない:user_idをハッシュに私がやったように。

次に、次の部分でヘルパー「logged_in?」を設定しています。誰かがログインしているかどうかを確認する

def logged_in? 
    !session.nil? 
end 

これはおそらく間違っていますが、私は試してみると思いました。

また、現在のユーザーが実際に誰であるかを確認する必要があります。私はsession[:user_id] == @user.idかこれに類するものでこれをやっていました。私が持っている主な質問は、どのように私は:cookieのuser_id値にアクセスするのですか?

最後にログアウトします。

post '/logout/?' do 
    session.clear 
end 

もし皆さんが私にこのすべてを踏まえれば、素晴らしいことになるでしょう!事前に感謝し、さらに情報が必要な場合は、私は提供して喜んでいただきます。

答えて

3

これははるかに簡単です。 http://www.sinatrarb.com/faq.html#sessions

enable :sessions 

post '/login/?' do 
    if do_login 
    session[:user_id] = params[:user_id] 
    end 
end 

post '/logout/?' do 
    session[:user_id] = nil 
end 

は、私は一般的にgetpostbeforeなどのブロックでは、ビジネスロジックにセッション管理を維持しようとします。 beforeフィルタを使用して、現在のセッションのユーザに「ログイン」することができます。

before '*' do 
    set :user_id, session[:user_id] 
end 

これは完全にオプションですが、あなたはあなたのrackupファイル内の任意のCookieの設定を置くことができます。

use Rack::Session::Cookie, 
    :key => 'rack.session', 
    :path => '/', 
    :expire_after => 14400, # In seconds 
    :secret => 'change_me' 
1

あなただけresponse

response.set_cookie "user_id", {:value => params['user_id'], 
           :expires => (Time.now + 52*7*24*60*60)} 

でそれを設定してみてください可能性があり、それがクッキー

response.delete_cookie "user_id" 

を削除するには

request.cookies["user_id"] 

で期限が切れる前に、あなたはいつでもそれを読み戻すことができます。 ..

+2

だけ考えました。 user_idではなく、ランダムなトークン( 'SecureRandom.hex'かもしれない)を各ユーザに与える価値があるかもしれません。 – fatnic

+0

少し進んでいます。ありがとう。まず、request.cookiesでなければなりません。たぶん私はそれを編集することができます、私は編集ボタンを参照してください。したがって、次のように入力します:response.delete_cookie 'user_id' response.set_cookie "user_id"、{:value => "some data"、:expires =>(Time.now + 52 * 7 * 24 * 60 * 60)} puts request.cookies ['user_id']と応答はちょうど "some data"です。私は応答としてハッシュ全体を取得することはできません。何か案は?ありがとう! – wuliwong

関連する問題