आप ऐसा करके कुछ सुरक्षा बलिदान करने जा रहे हैं, लेकिन यह निश्चित रूप से संभव है। इसे पूरा करने में सक्षम होने के दो तरीके हैं।
पहले, आप अपने उपयोगकर्ता मॉडल में make_token विधि को ओवरराइड कर सकते हैं। मॉडल वर्तमान में इस प्रकार लागू किया गया है।
def make_token
secure_digest(Time.now, (1..10).map{ rand.to_s })
end
हर बार जब कोई उपयोगकर्ता में लॉग करता है, के साथ या एक कुकी के बिना, make_token
विधि कहा जाता है जो उत्पन्न करता है और उपयोगकर्ता के लिए एक नया remember_token
बचाता है। यदि आपके पास कुछ अन्य मूल्य था जो उपयोगकर्ता के लिए अद्वितीय था जिसे अनुमान लगाया नहीं जा सका, तो आप make_token
विधि को प्रतिस्थापित कर सकते हैं।
def make_token
secure_digest(self.some_secret_constant_value)
end
इससे यह सुनिश्चित होता है कि टोकन कभी नहीं बदलता, लेकिन यह भी किसी को भी उस टोकन प्रयोक्ता का रूप धारण करने के लिए मिल गया सक्षम होगा।
इसके अलावा, यदि आप authenticated_system.rb
फ़ाइल में handle_remember_cookie!
विधि को देखें, तो आप इस विधि को आपके लिए काम करने में सक्षम होना चाहिए।
def handle_remember_cookie!(new_cookie_flag)
return unless @current_<%= file_name %>
case
when valid_remember_cookie? then @current_<%= file_name %>.refresh_token # keeping same expiry date
when new_cookie_flag then @current_<%= file_name %>.remember_me
else @current_<%= file_name %>.forget_me
end
send_remember_cookie!
end
आपको लगता है कि इस विधि उपयोगकर्ता मॉडल, refresh_token
, remember_me
, और forget_me
में तीन तरीकों कॉल पर ध्यान देंगे।
def remember_me
remember_me_for 2.weeks
end
def remember_me_for(time)
remember_me_until time.from_now.utc
end
def remember_me_until(time)
self.remember_token_expires_at = time
self.remember_token = self.class.make_token
save(false)
end
#
# Deletes the server-side record of the authentication token. The
# client-side (browser cookie) and server-side (this remember_token) must
# always be deleted together.
#
def forget_me
self.remember_token_expires_at = nil
self.remember_token = nil
save(false)
end
# refresh token (keeping same expires_at) if it exists
def refresh_token
if remember_token?
self.remember_token = self.class.make_token
save(false)
end
end
इन सभी तीन तरीकों से टोकन रीसेट हो गया। forget_me
इसे nil
पर सेट करता है, जबकि अन्य दो इसे make_token
द्वारा लौटाए गए मान पर सेट करते हैं। यदि आप मौजूद हैं और समाप्त नहीं हुए हैं, तो उन्हें टोकन को रीसेट करने से रोकने के लिए, इन मॉडलों को उपयोगकर्ता मॉडल में ओवरराइड कर सकते हैं। यह शायद सबसे अच्छा तरीका है, या आप handle_remember_cookie!
विधि में कुछ अतिरिक्त तर्क जोड़ सकते हैं, हालांकि यह अधिक काम करेगा।
यदि मैं आप थे, तो मैं उपयोगकर्ता मॉडल में remember_me_until
, forget_me
, और refresh_token
ओवरराइड कर दूंगा। निम्नलिखित काम करना चाहिए।
def remember_me_until(time)
if remember_token?
# a token already exists and isn't expired, so don't bother resetting it
true
else
self.remember_token_expires_at = time
self.remember_token = self.class.make_token
save(false)
end
end
#
# Deletes the server-side record of the authentication token. The
# client-side (browser cookie) and server-side (this remember_token) must
# always be deleted together.
#
def forget_me
# another computer may be using the token, so don't throw it out
true
end
# refresh token (keeping same expires_at) if it exists
def refresh_token
if remember_token?
# don't change the token, so there is nothing to save
true
end
end
ध्यान दें कि ऐसा करके, आप सुविधाओं है कि आप टोकन चोरी से बचाने के बाहर ले जा रहे हैं। लेकिन यह एक लागत लाभ निर्णय है जिसे आप कर सकते हैं।
धन्यवाद एक टन! तो उपयोगकर्ता को "मुझे याद रखें" की जांच करने की कार्यक्षमता अब कैसे काम करती है? क्या यह अभी भी उन्हें 'remember_me' विधि में निर्धारित समय के लिए याद है? – Shpigford
यह अभी भी याद है कि mem_me विधि में 2 सप्ताह के लिए, लेकिन टोकन का उपयोग पहली बार शुरू होता है। दूसरे शब्दों में, यदि आप कंप्यूटर ए से लॉग इन करते हैं, तो कंप्यूटर बी से 10 दिन लॉग इन करें, 4 दिन बाद टोकन दोनों कंप्यूटरों पर समाप्त हो जाता है। – jcnnghm
ग्रेट। आपकी सहायता के लिए एक बार फिर से धन्यवाद! – Shpigford