IT story

Rails의 하위 도메인간에 세션 (쿠키)을 공유 하시겠습니까?

hot-time 2020. 9. 15. 19:23
반응형

Rails의 하위 도메인간에 세션 (쿠키)을 공유 하시겠습니까?


각 사용자가 회사에 속한 앱 설정이 있고 해당 회사에는 하위 도메인이 있습니다 (basecamp 스타일 하위 도메인을 사용하고 있습니다). 내가 직면 한 문제는 rails가 여러 쿠키 (lvh.me에 대해 하나와 subdomain.lvh.me에 대해 하나)를 생성하여 내 응용 프로그램에서 꽤 많은 중단을 유발한다는 것입니다 (예 : 모든 요청을 한 번만 전달해도 플래시 메시지가 지속됨). 로그인).

내 /cofig/initilizers/session_store.rb 파일에 다음이 있습니다.

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

도메인 : : all이 Google에서 찾은 표준 답변 인 것 같지만 저에게는 효과가없는 것 같습니다. 도움을 주시면 감사하겠습니다!


결과적으로 '도메인 : 모두'는 해당 세션 중에 방문한 모든 다른 하위 도메인에 대한 쿠키를 생성합니다 (그리고 요청간에 전달되도록 보장합니다). 도메인 인수가 전달되지 않으면 동일한 세션에서 방문한 모든 다른 도메인에 대해 새 쿠키가 생성되고 이전 쿠키가 삭제됨을 의미합니다. 필요한 것은 도메인이 변경된 경우에도 세션 내내 지속되는 단일 쿠키였습니다. 따라서 합격 domain: "lvh.me"은 개발 문제 해결했습니다. 이렇게하면 서로 다른 하위 도메인간에 머무르는 단일 쿠키가 생성됩니다.

추가 설명이 필요한 사람에게는 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/

"여기서주의하고 싶은 부분은 : domain => : all like를 설정하면 일부 장소에서 권장되며 localhost를 사용하지 않는 한 작동하지 않는다는 것입니다. : all 기본값은 1의 TLD 길이입니다. 즉, Pow (myapp.dev)로 테스트하는 경우 길이 2의 TLD이므로 작동하지 않습니다. "

즉, 다음이 필요합니다.

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

쿠키를 지우는 것도 좋은 생각입니다.


도메인 이름을 명시 적으로 지정하지 않고도이 문제를 해결할 수있는 방법을 찾고 있었기 때문에 localhost, lvh.me 및 session_store.rb 파일을 계속 편집하지 않고도 프로덕션에서 사용할 도메인 사이를 이동할 수있었습니다. 그러나 "도메인 : : all"설정이 작동하지 않는 것 같습니다.

궁극적으로 그 표현식에서 tld_length (최상위 도메인 길이)를 명시해야한다는 것을 알았습니다. 예를 들어, 기본 tld_length는 1이고 example.lvh.me의 tld_length는 2이고 127.0.0.1.xip.io의 tld_length는 5입니다. 그래서 내가 개발중인 lvh.me의 하위 도메인에 대한 session_store.rb 파일에있는 내용과 프로덕션의 다른 내용은 다음과 같습니다.

MyApp::Application.config.session_store :cookie_store, key: '_MyApp_session', domain: :all, tld_length: 2

이 답변을 찾는 데 오랜 시간이 걸렸으므로 누군가에게 도움이되기를 바랍니다.


어떤 이유로 :all도메인 교체 가 작동하지 않았습니다 (rails 3.2.11). 이를 고치기 위해 커스텀 미들웨어가 필요했습니다. 해당 솔루션에 대한 요약은 다음과 같습니다.

tl; dr : 맞춤형 랙 미들웨어를 작성해야합니다. 당신은 그것을 당신의 conifg/environments/[production|development].rb. 이것은 Rails 3.2.11에 있습니다.

쿠키 세션은 일반적으로 최상위 도메인에 대해서만 저장됩니다.

당신이 보면 Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}당신에 대해 별도의 항목이있을 것이라는 점을 볼 수 있습니다 sub1.yourdomain.comothersub.yourdomain.comyourdomain.com

문제는 모든 하위 도메인에서 동일한 세션 저장소 파일을 사용하는 것입니다.

1 단계 : 사용자 지정 미들웨어 클래스 추가

여기에서 Rack Middleware 가 등장합니다. 관련 랙 및 레일 리소스 :

여기에 추가해야 할 사용자 정의 클래스가 있습니다. lib 이것은 @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

기본적으로 이것이하는 일은 모든 쿠키 세션 데이터를 루트 도메인과 동일한 동일한 쿠키 파일에 다시 매핑하는 것입니다.

2 단계 : Rails 구성에 추가

Now that you have a custom class in lib, make sure are autoloading it. If that meant nothing to you, look here: Rails 3 autoload

The first thing is to make sure that you are system-wide using a cookie store. In config/application.rb we tell Rails to use a cookie store.

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

The reason this is here is mentioned here is because of the :domain => :all line. There are other people that have suggested to specify :domain => ".yourdomain.com" instead of :domain => :all. For some reason this did not work for me and I needed the custom Middleware class as described above.

Then in your config/environments/production.rb add:

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

Note that the preceding dot is necessary. See "sub-domain cookies, sent in a parent domain request?" for why.

Then in your config/environments/development.rb add:

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

The lvh.me trick maps onto localhost. It's awesome. See this Railscast about subdomains and this note for more info.

Hopefully that should do it. I honestly am not entirely sure why the process is this convoluted, as I feel cross subdomain sites are common. If anyone has any further insights into the reasons behind each of these steps, please enlighten us in the comments.


I came across this while looking for the simplest way to set the cookie to be the root domain. It seems there is some misinformation about the :all option when passed as the domain option. For most domains, it will actually work as expected, setting the cookie to the root domain (e.g. .example.com for test.example.com). I think most people experienced issues since they're using the domain lvh.me to test. The regex used by rails to find a top level domain is defined to be DOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/. If you note the last part, you can see that rails interprets lvh.me as a TLD similar to com.au. If your use case needs lvh.me to work, then the :all option won't work properly, however, it appears to be the simplest and best option for most domains.

TL;DR, the correct answer here, assuming you aren't developing on a 3 letter domain (or any domain that confuses the above regex) is to use :all.


Rails 4.x (also should be fine with Rails 5 version)

How to get lvh.me:3000 and subdomain in localhost (Rails)

Simply, I have shared cookies to adding .lvh.me into session_store.rb,

It will be shared between subdomains on localhost admin.lvh.me:3000, lvh.me:3000 and so on...

#config/initializers/session_store.rb

if Rails.env.production?
    Rails.application.config.session_store :cookie_store, 
                      key: '_app_name_session', domain: ".domain_name.com"
else
    Rails.application.config.session_store :cookie_store, 
                      key: '_app_name_session', domain: '.lvh.me'
end

Did you try

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

)

basically we are saying have single cookie for base domain and just ignore sub domain..though this approach has some flaws still ...


support rails5

if you want it works with any domain:

Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: :all, tld_length: 2

To configure per environment you could use the following:

Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: {
  production: '.example.com',
  development: '.example.dev'
}.fetch(Rails.env.to_sym, :all)

Ref: https://github.com/plataformatec/devise/wiki/How-To:-Use-subdomains

참고URL : https://stackoverflow.com/questions/10402777/share-session-cookies-between-subdomains-in-rails

반응형