2012-04-17 16 views
4

セッションメンバーが設定されていても、セッションメンバーが利用できないという問題を解決しました。問題が発生した理由を知りたいと思っています。 :sessionを使用してSinatraのセッションメンバーが「消えています」

  1. シナトラアプリ:私の状況はとして記述することができます。
  2. oAuthを使用してユーザーを認証し、プロセスで:ret_urlセッションメンバーを設定して、認証後にどこに戻ってくるかをアプリが認識できるようにします。
  3. Serverは、シーダー・スタック(Herokuの)

これは、ローカルで実行しながら、完璧に動作しますが、:ret_urlセッションメンバーが完全にHerokuの上のセッションから消えたのユニコーンです。私はこのコードを削除した場合、それは問題を修正していることが見つかりました:

before do 
    cache_control :public, :must_revalidate, :max_age => 60 
    end 

は質問1:私は私のクッキーが:ret_url値なしでキャッシュされていたことを推測していると、それが破壊された理由ですか?

質問2:以下のルート条件コードに示すようにセッションメンバーを設定しましたが、これは間違った場所ですか?

# redirect users to login if necessary 
    set(:auth) do |access_token|  
    condition do 

     if request.request_method == 'GET' 
     session[:ret_url] = request.path_info 
     end 

     redirect '/' unless user_logged_in? 
    end 
    end 

私はcacheingを使用し、まだ私のクッキーが有効であるしたいのですが。

+0

セッション秘密鍵を設定しましたか? set:session_secret、 'super secret' – mscccc

+0

Sinatraアプリケーションをローカルで実行しても、Heroku上で動作しているときにセッションメンバーが存在する問題が発生しています。私はoAuthを使って試してきましたが、今はコアラとFacebookとのやりとりをしていて、どちらも同じ問題を抱えています。 –

答えて

1

すべての詳細を知らなくても何が起こっているのか分かりにくいですが、おそらく違反しているという単純なルールがあります。何かをするアクション(ページの表示以外) 。 httpキャッシングがオンの場合、ブラウザはページを再読み込みしようとしてもブラウザキャッシュからレンダリングしません。

クッキーがどこにもキャッシュされません、cache_controlが行う唯一のことは、あなたができる最善のことは、あなたの前のブロックにノーアクションページを持つルートのリストを追加することで、あなたのケースでCacheControl HTTP応答値

を設定しています:

before '/my/static/page' do 
    cache_control :public, :must_revalidate, :max_age => 60 
end 

おそらくあなたはここにメンバーではないアリ・ブラウン(アリの波)の名前でHTTPキャッシュ

+0

関連:あなたの応答が含まれているか、そうでなければユーザー固有またはセッション固有のものに依存する場合は、 ':public'を使用しないでください。私は通常、私がキャッシュしたいリソースのためにミドルウェアを設定します。それは、受信したすべてのクッキーとセッションデータを取り除いて、私が偶然何かを参照するのを防ぐものです。 – willglynn

1

chapから恩恵を受けることができるルートの非常に限られたセットを持っていますが、これのクレジットに値する答えは、enable :sessionsを使用しますが、私は私のconfig.ruにこれを追加しましたし、すべてがうまく

use Rack::Session::Cookie, :key => 'rack.session', 
          :domain => 'foo.com', 
          :path => '/', 
          :expire_after => 2592000, # In seconds 
          :secret => 'change_me' 

あたりとしてuse Rack::Session::Cookieにしないように、the Sinatra FAQあたりとして、ある適切なソリューション、で私を指摘しました。

enable :sessions 
set :session_secret, ENV['SESSION_KEY'] || 'change_me' 

明らかにアプリで、その後

$ heroku config:add SESSION_KEY=a_longish_secret_key 

あなたがすることができます

は、私はまた、すなわち、環境変数を介してこれを行うには、確かに、set :session_secret, 'change_me'this postに代替案をオーバー気づき、 Rack::Session::Cookieアプローチでも環境変数戦略を使用してください。それが構成の柔軟性を高めるので、私が行った方法です。

キャッシュコントローラのミドルウェアは、複数のサーバーインスタンスに要求を送り出し、セッションシークレットを設定せずにサーバーごとにセッションを分割するだけなので、セッションが切断されます。

関連する問題