2016-01-07 5 views
6

Rails 4.xでは、secret_key_baseは、セッションクッキーと、cookies.signedを呼び出して作成された署名付きクッキーに署名するために使用されます。Railsでは、以前に署名したデータを失うことなくsecret_key_baseを更新できますか?

私は、このsecret_key_baseを更新/サイクル/ロールしたいと思いますが、以前に署名したすべてのクッキーへのアクセスを失うことはありません(セッションを失うことは気にしません)。これは可能ですか?

  1. secret_key_base新しいを追加します。

    理想的には私のような何かをしたいと思います。

  2. 古いキーと新しいキーの両方を使用して、古いキーを使用して署名されたクッキーを新しいキーで再署名できるようにします。
  3. 古いsecret_key_baseを削除します。

secret_tokenからsecret_key_baseにアップグレードするための同様の機能があります。 Railsを使ってこれを達成する方法はありますか?

答えて

0

さまざまな方法で対処できます。 今すぐ古いsecret_keyを保存し、特定のユーザーにマッピングされたすべてのCookieデータを保存できる一時テーブルを作成します。これにもredisを使うことができます。すべての既存のCookieデータが受信されたことが確実であれば、secret_keyを変更できます。これにより、すべてのCookieデータが無効になります。クッキーが受信されるたびに、そのデータがユーザに存在するかどうかを最初に確認し、それに応じてクッキーを設定し、一時テーブル/ key_storeからエントリを削除します。一時テーブルが空になったら、あなたはあなたが最初にあなたの古いsecret_key_baseでクッキーを読み取ろうとするクッキーのミドルウェアでencryptedsignedのようなメソッドの一部を上書きすることによって、これを達成することができます完全

+0

特定のユーザーをどのように知ることができますか?私は訪問者がログインしているとは想定できません。訪問者ごとに一意の識別子を生成しても、署名されていないCookieに保存するか(他人のCookieデータを取得するのは簡単です)、署名された別のクッキー(私たちがどこから始めたか) – Felix

2

メカニズムを削除することができます。それが成功すれば、新しいものにアップグレードすることができます。最終的にすべての古いクッキーは新しいものにアップグレードされ、カスタムパッチを削除することができます。メッセージの検証がここで働いているかもチェックアウト

https://github.com/rails/rails/blob/8350925bec434168f56b4fae22b5298cb4a83c41/actionpack/lib/action_dispatch/middleware/cookies.rb

を見てみましょう。

https://github.com/rails/rails/blob/8350925bec434168f56b4fae22b5298cb4a83c41/actionpack/lib/action_dispatch/middleware/cookies.rb#L251

お役に立てば幸いです。

関連する問題