रेल्स में उप-डोमेन के बीच साझा सत्र (कुकीज़)?


92

मेरे पास एक ऐप सेटअप है जहां प्रत्येक उपयोगकर्ता किसी कंपनी का है, और उस कंपनी के पास एक उपडोमेन है (मैं बेसकैंप स्टाइल सबटाइटल का उपयोग कर रहा हूं)। मुझे जो समस्या आ रही है, वह यह है कि रेल कई कुकीज (एक lvh.me के लिए और दूसरा उपडोमेन के लिए बना रही है। lvh.me) जो कि मेरे एप्लिकेशन में काफी कुछ विघटित कर रहा है (जैसे फ्लैश मैसेज लगातार बने रहना, हालांकि सभी एक बार बाहर हो जाते हैं साइन इन किया)।

मेरे पास मेरी / cofig/initilizers/session_store.rb फ़ाइल में यह है:

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

डोमेन:: सभी मुझे Google पर मिला मानक उत्तर लगता है, लेकिन यह मेरे लिए काम नहीं करता है। किसी भी मदद की सराहना की है!

जवाबों:


74

जैसा कि यह बाहरी 'डोमेन: सभी को बदल देता है' उस सत्र के दौरान आने वाले सभी विभिन्न उप-डोमेन के लिए एक कुकी बनाता है (और यह सुनिश्चित करता है कि वे अनुरोध के बीच पारित हो गए हैं)। यदि कोई डोमेन तर्क पारित नहीं होता है, तो इसका मतलब है कि एक ही सत्र में जाने वाले प्रत्येक अलग डोमेन के लिए एक नया कुकी बनाया जाता है और पुराने को छोड़ दिया जाता है। मुझे जिस चीज की आवश्यकता थी, वह एकल कुकी थी जो पूरे सत्र में बनी रहती है, तब भी जब डोमेन में परिवर्तन होता है। इसलिए, पासिंग domain: "lvh.me"ने विकास में समस्या को हल किया। यह एक एकल कुकी बनाता है जो विभिन्न उप-डोमेन के बीच रहता है।

किसी और स्पष्टीकरण की आवश्यकता के लिए, यह एक बढ़िया लिंक है: http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/


2
धन्यवाद दोस्त .. मैं अपनी परियोजनाओं में से एक पर इस मुद्दे का सामना कर रहा हूँ .. अंत में समाधान मिल गया ..
शिरजील आलम

3
config.secret_key_baseअपने सभी अनुप्रयोगों में समान उपयोग करना सुनिश्चित करें , अन्यथा यह कुकी को डिकोड करने में सक्षम नहीं होगा।
ब्रूनो बुकोलो

5
मुझे रेल 4 के लिए इससे संबंधित कोई प्रश्न नहीं दिखता है। क्या आप जानते हैं कि यह बदल गया है। मैं इसे अपने प्रोजेक्ट के साथ काम नहीं कर सकता। यह कुकीज़ को फिर से बनाए रखता है। धन्यवाद।
एंडी

क्या होगा यदि मैं CacheStoreसत्रों में स्टोर करने के लिए उपयोग करना चाहता हूं ?
अमित पटेल

2
रेल 4 के साथ, मैंने पाया कि यह केवल डैश के साथ सबडोमेन के लिए काम करता है लेकिन अंडरस्कोर के साथ नहीं:Appname::Application.config.session_store :cookie_store, key: '_appname_session', domain: :all, tld_length: 2
user1515295

68

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

"जिस भाग को आप यहां देखना चाहते हैं, वह यह है कि यदि आप सेट करते हैं: डोमेन =>: सभी को कुछ स्थानों में अनुशंसित किया जाता है, तो यह तब तक काम नहीं करेगा जब तक कि आप लोकलहोस्ट का उपयोग नहीं कर रहे हैं ।: सभी चूक TLD की लंबाई 1 , जिसका मतलब है कि अगर आप Pow (myapp.dev) के साथ परीक्षण कर रहे हैं तो यह या तो काम नहीं करेगा क्योंकि यह लंबाई 2 का TLD है। "

दूसरे शब्दों में आपको चाहिए:

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

इसके अलावा अपने कुकीज़ को साफ करने के लिए एक अच्छा विचार है


1
यह सबसे अच्छा उत्तर है क्योंकि एक परिवर्तन सभी वातावरणों में काम करता है (app.com और app.dev)। कस्टम मिडलवेयर आवश्यक नहीं है। कुकीज़ को साफ़ करने के लिए भी अच्छा बिंदु!
तुरग

1
आपको , :tld_length => 2
montrealmike

1
config.secret_key_baseअपने सभी अनुप्रयोगों में समान उपयोग करना सुनिश्चित करें , अन्यथा यह कुकी को डिकोड करने में सक्षम नहीं होगा।
ब्रूनो बुकोलो

4
:domain => :allरेल 4 में काम नहीं करेंगे, कोशिश करें domain => 'lvh.me', tld_length = 2। यह मेरे लिए काम करता है
मिन्ह ट्राई ऑक्ट

1
4.2 के साथ डोमेन domain: :all, tld_length: 2का उपयोग करते समय मुझे अच्छे परिणाम मिले lvh.me
zwippie

24

मैं स्पष्ट रूप से डोमेन नाम को बताए बिना इस समस्या को हल करने के लिए एक रास्ता तलाश रहा था, इसलिए मैं स्थानीयहोस्ट, lvh.me और जो भी मैं उत्पादन में उपयोग करूंगा बिना सत्र_स्टोरी.rr फ़ाइल को संपादित किए बिना उपयोग कर सकता हूं। हालाँकि, "डोमेन:: सभी" सेट करना मेरे लिए काम नहीं कर रहा था।

अंततः मैंने पाया कि मुझे उस अभिव्यक्ति में tld_length (शीर्ष स्तर की डोमेन लंबाई) बताने की आवश्यकता है। डिफ़ॉल्ट tld_length 1 है, जबकि example.lvh.me में 2 का tld_length है और 127.0.0.1.xip.io में 5 का tld_length है, उदाहरण के लिए। तो मेरे पास विकास में lvh.me पर उपडोमेन के लिए session_store.rb फ़ाइल में क्या था और उत्पादन में जो कुछ भी था वह नीचे था।

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

आशा है कि यह किसी की मदद करता है, क्योंकि मुझे इस उत्तर को खोजने में बहुत समय लगा!


19

किसी कारण :allसे डोमेन के साथ प्रतिस्थापित करने से मेरे लिए काम नहीं हुआ (रेलगाड़ी 3.2.11)। इसे ठीक करने के लिए कस्टम मिडलवेयर का एक टुकड़ा लिया। उस समाधान का एक सारांश नीचे है।

tl; dr: आपको एक कस्टम रैक मिडलवेयर लिखने की आवश्यकता है। आपको इसे अपने में जोड़ने की आवश्यकता है conifg/environments/[production|development].rb। यह रेल 3.2.11 पर है

कुकी सत्र आमतौर पर केवल आपके शीर्ष स्तर के डोमेन के लिए संग्रहीत किए जाते हैं।

आप में देखो, तो Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}आप देख सकते हैं कि वहाँ के लिए अलग-अलग प्रविष्टियों हो जाएगा sub1.yourdomain.comऔर othersub.yourdomain.comऔरyourdomain.com

सभी उप डोमेन में एक ही सत्र स्टोर फ़ाइल का उपयोग करने की चुनौती है।

चरण 1: कस्टम मिडिलवेयर क्लास जोड़ें

यह वह जगह है जहाँ रैक मिडलवेयर आता है। कुछ प्रासंगिक रैक और रेल संसाधन:

यहाँ एक कस्टम क्लास है जिसे आपको इसमें जोड़ना चाहिए @Naderlib द्वारा लिखा गया था और आप सभी को उसका धन्यवाद करना चाहिए

# 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: रेल विन्यास में जोड़ें

अब जब आपके पास एक कस्टम वर्ग है लिब में, सुनिश्चित करें कि यह ऑटोलॉडिंग है। अगर आपको इससे कोई मतलब नहीं है, तो यहां देखें: रेल 3 ऑटोलैड

पहली बात यह सुनिश्चित करना है कि आप कुकी स्टोर का उपयोग करके सिस्टम-वाइड हैं। में 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 ट्रिक मैप्स। यह विस्मयकारी है। उप - डोमेन के बारे में इस Railscast देखें और अधिक जानकारी के लिए इस नोट

उम्मीद है कि इसे करना चाहिए। मैं ईमानदारी से पूरी तरह से आश्वस्त नहीं हूं कि यह प्रक्रिया क्यों जटिल है, क्योंकि मुझे लगता है कि क्रॉस सबडोमेन साइटें आम हैं। यदि किसी के पास इन कदमों के पीछे के कारणों में कोई और अंतर्दृष्टि है, तो कृपया हमें टिप्पणियों में बताएं।


क्या कई शीर्ष स्तरीय डोमेन के साथ यह काम करने का कोई तरीका है? मेरा एक उत्पाद है जो विभिन्न देशों में चलता है। यहां हम मान रहे हैं कि डिफ़ॉल्ट डोमेन yourdomain.com है, लेकिन अगर यह .be .sv .fr .com.br.com.ar और अन्य के लिए काम करने वाला हो तो क्या होगा? धन्यवाद।
मार्क लीनज

मुझे अभी यह काम नहीं मिल रहा है। मैं रेल 4 में विकसित कर रहा हूं और ऐसा लगता है कि धारावाहिक ऊपर दिए गए सभी कोड को धीरे से नजरअंदाज कर देता है। यह सिर्फ उप-डोमेन के सत्र को साझा नहीं करना चाहता है।
ओले हेनरिक स्कोगस्ट्रोम

@ OleHenrikSkogstrøm config.secret_key_baseअपने सभी अनुप्रयोगों में समान उपयोग करना सुनिश्चित करें , अन्यथा यह कुकी को डिकोड करने में सक्षम नहीं होगा।
ब्रूनो बुकोलो

17

कुकी को रूट डोमेन बनाने के लिए सबसे आसान तरीका खोजते हुए मैं इस पार आया। ऐसा लगता है :allकि डोमेन विकल्प के रूप में पारित होने पर विकल्प के बारे में कुछ गलत जानकारी है । अधिकांश डोमेन के लिए, यह वास्तव में अपेक्षित के रूप में काम करेगा, कुकी को रूट डोमेन (जैसे के .example.comलिए test.example.com) सेट करना। मुझे लगता है कि ज्यादातर लोग समस्याओं का अनुभव करते हैं क्योंकि वे lvh.meपरीक्षण करने के लिए डोमेन का उपयोग कर रहे हैं । शीर्ष स्तर के डोमेन को खोजने के लिए रेल द्वारा उपयोग किए जाने वाले रेगेक्स को परिभाषित किया गया है DOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/। यदि आप अंतिम भाग को नोट करते हैं, तो आप देख सकते हैं कि रेल lvh.meTLD के समान है com.au। यदि आपके उपयोग के मामले lvh.meमें काम करने की जरूरत है, तो:all विकल्प ठीक से काम नहीं करेगा, हालांकि, यह अधिकांश डोमेन के लिए सबसे सरल और सबसे अच्छा विकल्प प्रतीत होता है।

TL, DR, यहाँ सही उत्तर है, यह मानते हुए कि आप 3 लेटर डोमेन (या उपरोक्त रीगेक्स को भ्रमित करने वाले किसी भी डोमेन) का उपयोग नहीं कर रहे हैं :all


धन्यवाद, इसने आखिरकार मुझे यह समझने में मदद की कि इतने सारे उत्तर 2 के tld_length की सिफारिश क्यों कर रहे थे लेकिन मुझे इसकी आवश्यकता क्यों नहीं थी!
सूपडॉग

इस उत्तर को और ऊपर ले जाने की आवश्यकता है। धन्यवाद महोदय।
लूका.बुसिन

"lvh.me com.au के समान TLD है" BTW रेल को वास्तव में व्याख्या करना चाहिए। ठीक उसी तरह जैसे कि यह एक देश डोमेन (मोंटेनेग्रो) भी है।
Mahemoff

7

रेल्स 4.x (रेल 5/6 संस्करणों के साथ भी ठीक होनी चाहिए)

स्थानीय हॉस्टल (रेल) में lvh.me:3000 और उपडोमेन कैसे प्राप्त करें

विकास: मैंने कुकीज़ को जोड़ने के लिए साझा .lvh.meकिया है session_store.rb,

यह स्थानीयहोस्टेन पर उप-डोमेन के बीच साझा किया जाएगा 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

4

क्या आप ने कोशिश की

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

)

मूल रूप से हम कह रहे हैं कि बेस डोमेन के लिए एक ही कुकी है और बस उप डोमेन को अनदेखा करें .. हालांकि इस दृष्टिकोण में अभी भी कुछ खामियां हैं ...


1

समर्थन रेल 5

यदि आप चाहते हैं कि यह किसी भी डोमेन के साथ काम करे:

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

प्रति वातावरण को कॉन्फ़िगर करने के लिए आप निम्नलिखित का उपयोग कर सकते हैं:

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

रेफरी: https://github.com/plataformatec/devise/wiki/How-To:-Use-ububustains


0

यदि आप सेशन स्टोर के लिए रेडिस का उपयोग कर रहे हैं।

if Rails.env.development?
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: 'localhost', port: 6379},
      ],
      key: '_app_session',
      expire_after: 1.day,
      domain: :all
    }

else
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: HOST_URL, port: PORT},
      ],
      key: '_app_session',
      expire_after: 1.day,
      domain: '.domain.com',
      tld_length: 2
    }
    
end 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.