ruby-on-rails - セッション - rails session cookie



Railsのサブドメイン間でセッション(クッキー)を共有できますか? (5)

「ドメイン:all」と表示されているので、そのセッション中に訪問されたすべての異なるサブドメインのCookieが作成されます(要求のあいだに渡されます)。 ドメイン引数が渡されない場合は、同じセッションでアクセスされた異なるドメインごとに新しいCookieが作成され、古いセッションは破棄されます。 私が必要としたのは、ドメインが変わっても、セッション中永続的な単一のクッキーでした。 したがって、 domain: lvh.meを渡すことで、開発の問題が解決されました。 これにより、異なるサブドメイン間に存在する単一のCookieが作成されます。

これ以上の説明が必要な人には、これは素晴らしいリンクです: http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/ : http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/

私は、各ユーザーが会社に所属し、その会社にサブドメイン(私はベースキャンプスタイルのサブドメインを使用しています)を持っているアプリケーション設定をしています。 私が直面している問題は、レールが複数のクッキー(1つはlvh.me用、もう1つはsubdomain.lvh.me用)を作成していることです。これはアプリケーションでかなりの数のブレークを引き起こしていますログインしました)。

/cofig/initilizers/session_store.rbファイルにこれがあります:

AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: :all

ドメイン::すべてが私がGoogleで見つけた標準的な答えのようですが、それは私のために働いていないようです。 どんな助けもありがとう!


Answer #1

http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/

"ここで注意したい部分は:domain =>:すべてのようなものがいくつかの場所で推奨されていれば、あなたがlocalhostを使用していない限り動作しません:すべてデフォルトはTLDの長さ1つまり、Pow(myapp.dev)を使ってテストしている場合は、長さ2のTLDであるため動作しません。

換言すれば、

 App.config.session_store ... , :domain => :all, :tld_length => 2

また、クッキーをクリアするための良いアイデア


Answer #2

クッキーをルートドメインに設定する最も簡単な方法を探しながら、私はこれを見つけました。 :allオプションがドメインオプションとして渡されると、いくつかの誤った情報があるようです。 ほとんどのドメインでは、実際には期待通りに動作し、クッキーをルートドメインに設定します(例: test.example.com .example.com )。 私はほとんどの人がドメインlvh.meを使ってテストしているので問題を経験したと思います。 トップレベルのドメインを見つけるためにレールで使用される正規表現は、 DOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/定義されています。 最後の部分に注意すると、 com.aucom.auと似たTLDとして解釈することがわかります。 あなたのユースケースにlvh.meが必要な場合、 :allオプションは正しく動作しませんが、ほとんどのドメインにとっては最もシンプルで最適なオプションです。

TL; DR、3つの文字ドメイン(または上の正規表現を混乱させるドメイン)で開発していないと仮定した場合の正解は、 :allを使用すること:all


Answer #3

何らかの理由で置き換えられました。私はドメイン:allが動作しませんでした(レール3.2.11)。 それを修正するためにカスタムミドルウェアが必要でした。 その解決策の概要を以下に示します。

tl; dr:カスタムRack Middlewareを作成する必要があります。 conifg/environments/[production|development].rb追加する必要があります。 これはRails 3.2.11です

Cookieセッションは、通常、最上位ドメインのみに格納されます。

Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}を見る場合Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com} sub1.yourdomain.comエントリが別々になることがわかりますsub1.yourdomain.comothersub.yourdomain.comyourdomain.com

課題は、すべてのサブドメインで同じセッションストアファイルを使用することです。

ステップ1:カスタムミドルウェアクラスを追加する

これは、 ラックミドルウェアが入ってくる場所です。関連するラック&レールのリソース:

ここにあなたがlib追加すべきカスタムクラスがあります。 これは@Naderによって書かれた@Naderあり、皆さんは彼に感謝すべきです

# Custom Domain Cookie
#
# Set the cookie domain to the custom domain if it's present
class CustomDomainCookie
  def initialize(app, default_domain)
    @app = app
    @default_domain = default_domain
  end

  def call(env)
    host = env["HTTP_HOST"].split(':').first
    env["rack.session.options"][:domain] = custom_domain?(host) ? ".#{host}" : "#{@default_domain}"
    @app.call(env)
  end

  def custom_domain?(host)
    host !~ /#{@default_domain.sub(/^\./, '')}/i
  end
end

基本的には、すべてのCookieセッションデータをルートドメインと同じCookieファイルにマップすることです。

ステップ2:Railsに追加する

libにカスタムクラスがあるので、それを自動ロードしてください。 それがあなたにとって意味のないものなら、ここを見てください: Rails 3 autoload

まず、クッキーストアを使用してシステム全体にいることを確認することです。 config/application.rbでは、RailsにCookieストアを使用するよう指示します。

# We use a cookie_store for session data
config.session_store :cookie_store,
                     :key => '_yourappsession',
                     :domain => :all

これがここに記載されている理由は、 :domain => :all行のためです。 :domain => :all代わりに:domain => ".yourdomain.com"を指定するよう提案している人がいます。 何らかの理由でこれは私にとってはうまくいかず、上記のようにカスタムミドルウェアクラスが必要でした。

次に、あなたのconfig/environments/production.rb追加します:

config.middleware.use "CustomDomainCookie", ".yourdomain.com"

前のドットが必要であることに注意してください。 理由については、「 親ドメイン要求で送信されたサブドメインCookie 」を参照してください。

次に、あなたのconfig/environments/development.rb追加します:

config.middleware.use "CustomDomainCookie", ".lvh.me"

lvh.meのトリックはlocalhostにマップされます。 それは素晴らしいです。 詳細についてはこの サブドメインこのノートの Railscastを参照してください。

うまくいけばそれはそれをするべきです。 私は正直なところ、なぜこのプロセスが複雑であるのか完全には分かっていません。クロスドメインサブサイトが共通していると感じています。 これらの各ステップの背後にある理由について誰かがさらに洞察を持っている場合は、コメントで私たちに教えてください。


Answer #4

試しましたか

AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: 'lvh.me'  

基本的にはベースドメイン用のシングルクッキーを持っており、サブドメインを無視しているということです。このアプローチにはまだいくつかの欠陥があります...





devise