[ruby-on-rails] 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

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


답변

도메인 이름을 명시 적으로 지정하지 않고도이 문제를 해결할 수있는 방법을 찾고 있었으므로 session_store.rb 파일을 계속 편집하지 않고도 localhost, lvh.me 및 프로덕션에서 사용할 도메인 사이를 이동할 수 있습니다. 그러나 “도메인 : : 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 구성에 추가

이제 lib에 사용자 정의 클래스가 있으므로 자동로드되는지 확인하십시오. 아무 의미가 없다면 여기를보세요 : Rails 3 autoload

첫 번째는 쿠키 저장소를 사용하여 시스템 전체에 있는지 확인하는 것입니다. 에서 config/application.rb우리는 쿠키 저장소를 사용하도록 레일을 말한다.

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

이것이 여기에 언급 된 이유는 :domain => :all선 때문입니다 . :domain => ".yourdomain.com"대신 지정하도록 제안한 다른 사람들이 있습니다 :domain => :all. 어떤 이유로 이것은 저에게 효과가 없었고 위에서 설명한 것처럼 사용자 정의 미들웨어 클래스가 필요했습니다.

그런 다음 config/environments/production.rb추가 :

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

앞의 점이 필요합니다. 이유는 ” 상위 도메인 요청에서 전송 된 하위 도메인 쿠키입니까? “를 참조하십시오 .

그런 다음 config/environments/development.rb추가 :

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

lvh.me 트릭은 localhost에 매핑됩니다. 그것은 굉장. 참조 하위 도메인에 대한이 Railscast메모 추가 정보를 원하시면 있습니다.

바라건대 그렇게해야합니다. 나는 교차 하위 도메인 사이트가 일반적이라고 생각하기 때문에 프로세스가 왜 이렇게 복잡한 지 완전히 확신하지 못합니다. 이러한 각 단계의 이유에 대해 더 많은 통찰력이있는 사람이 있으면 의견을 통해 알려주십시오.


답변

쿠키를 루트 도메인으로 설정하는 가장 간단한 방법을 찾는 동안 이것을 발견했습니다. :all도메인 옵션으로 전달되었을 때 옵션 에 대한 잘못된 정보가있는 것 같습니다 . 예상대로 대부분의 도메인의 경우, 실제로 (예를 들어 루트 도메인에 쿠키를 설정, 작동 .example.com에 대한 test.example.com). 대부분의 사람들은 도메인 lvh.me을 사용하여 테스트하기 때문에 문제를 경험했다고 생각합니다 . 레일에서 최상위 도메인을 찾기 위해 사용하는 정규식은로 정의됩니다 DOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/. 마지막 부분을 살펴보면 rails lvh.me가와 유사한 TLD로 해석된다는 것을 알 수 있습니다 com.au. 사용 사례가 lvh.me작동 해야하는 경우 :all옵션이 제대로 작동하지 않지만 대부분의 도메인에서 가장 간단하고 최상의 옵션 인 것으로 보입니다.

TL; DR, 여기서 정답은 3 글자 도메인 (또는 위의 정규식을 혼동하는 도메인)에서 개발하지 않는다고 가정 할 때 :all.


답변

Rails 4.x (Rails 5/6 버전에서도 괜찮음)

localhost에서 lvh.me:3000 및 하위 도메인을 가져 오는 방법 (레일)

개발 :에 추가하기 위해 쿠키를 공유 .lvh.me했습니다 session_store.rb.

localhost admin.lvh.me:3000등의 하위 도메인간에 공유 lvh.me:3000됩니다.

#config/initializers/session_store.rb

domain = Rails.env.production? ? ".domain_name.com" : ".lvh.me"

Rails.application.config.session_store :cookie_store,
                      key: '_app_name_session', domain: domain


답변

시도해 보았 니

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

)

기본적으로 우리는 기본 도메인에 대해 단일 쿠키가 있고 하위 도메인을 무시한다고 말합니다.이 접근 방식에는 여전히 몇 가지 결함이 있지만 …