मैं एक नोडज (एक्सप्रेस) सर्वर पर काम कर रहा हूं और एक प्रतिक्रिया एफई एपीआई का उपयोग कर रहा हूं। सर्वर टोकन एक टोकन और गुप्त स्टोर करता है। जब उपयोगकर्ता FE से लॉग आउट करता है तो रहस्य ताज़ा हो जाता है। (मूल डेवलपर ने कस्टम प्रमाणीकरण का उपयोग किया और JWT का नहीं..) समस्या यह है कि यदि उपयोगकर्ता लॉगआउट बटन नहीं दबाता है, तो उन्हें अनिश्चित काल तक लॉग इन किया जा सकता है। समाधान के संदर्भ में मेरे पास एक विचार है जहां किसी भी तरह सर्वर क्लाइंट से अंतिम अनुरोध की निगरानी कर सकता है, जब 30 मिनट बीत चुके हैं, तो सर्वर रहस्य को अपडेट कर सकता है- मैंने इसे मैन्युअल रूप से आजमाया और जब क्लाइंट को रीफ्रेश किया गया तो एपीआई कॉल विफल हो गया अनादर से। मैं एफई में कुछ अतिरिक्त तर्क में निर्माण कर सकता था, उपयोगकर्ता को लॉगआउट संदेश प्रदर्शित करने में त्रुटि पकड़ रहा था और फिर स्थानीय भंडारण को हटा रहा था। इसके अलावा, ग्राहक पिछले एपीआई कॉल से 25 मिनट की गिनती कर सकता है, और उपयोगकर्ता को लॉग आउट करने से पहले उलटी गिनती के साथ संवाद प्रदर्शित कर सकता है।

शायद, मैं इसे जटिल बना रहा हूं और एक और तरीका है - वर्तमान में स्थानीय भंडारण का उपयोग कर रहा हूं, लेकिन अगर मैं कुकीज़ का उपयोग करना चाहता हूं, तो यह ब्राउज़र निष्क्रियता या ब्राउज़र बंद होने पर ऑटो लॉगआउट की समस्या को हल करेगा और यदि संवाद करना संभव है कुकी की समय सीमा समाप्त होने से पहले उलटी गिनती (जो उपयोगकर्ता द्वारा सत्र को खुला रखने का चयन करने पर नवीनीकृत हो जाती है)

एक व्यावहारिक विकल्प पर आभारी होंगे।

कोड:

api/createCustomer

schemaObj.customerToken = crypto.createHash('sha1').update(uuidv4()).update(config.hidden.salt).digest('hex');
schemaObj.customerSecret = crypto.createHash('sha256').update(uuidv4()).update(config.hidden.secret).digest('hex');
schemaObj.password = bcrypt.hashSync(password, bcrypt.genSaltSync(10));


api/login

var loginValid = bcrypt.compareSync(password, bidder.password);
....
res.apiSuccess(customer);

प्रतिक्रिया कोड:

axios.post('/api/login', formData)
let { customerToken, customerSecret, isVerified } = res.data.data;
.....

localStorage.setItem("customerData", JSON.stringify({ customerToken, customerSecret }));
0
Orange Juice Jones 31 जिंदा 2021, 01:28

2 जवाब

सबसे बढ़िया उत्तर

यदि आप लॉगिन पर समाप्ति चाहते हैं तो आपको इसके खिलाफ जांच करने के लिए कहीं टाइमस्टैम्प संपत्ति सहेजनी होगी। अधिकांश मानक प्रमाणीकरण प्रणाली में यह जगह होती है, उदा। JWT के पास क्स्प दावा है और कुकीज़ की अधिकतम आयु है।

आपके द्वारा वर्णित कस्टम सिस्टम के लिए आपको स्वयं इसका ट्रैक रखने की आवश्यकता है।

जैसा कि मैं सिस्टम को समझता हूं

  • ग्राहक टोकन = ग्राहक की आईडी
  • ग्राहक पासवर्ड = लॉग इन करने के लिए पासवर्ड
  • CustomerSecret = वास्तविक टोकन जो सर्वर पर प्रतिक्रिया से सभी अनुरोधों के साथ भेजा जाता है।

तो सर्वर ग्राहक गुप्त प्राप्त करता है, इसमें एक मध्यस्थ है जो डेटाबेस के खिलाफ उस रहस्य की जांच करता है कि उपयोगकर्ता को जारी रखने की अनुमति दी जानी चाहिए या नहीं।

आपके पास कुछ विकल्प हैं

अपने यूजरटेबल में कॉलम लॉग इनटाइम जोड़ें।

  • जब उपयोगकर्ता लॉग इन करता है तो उस फ़ील्ड को वर्तमान टाइमस्टैम्प के साथ अपडेट करें।
  • जब डेटाबेस में रहस्य देखा जाता है, तो जांचें कि लॉगिन से टाइमस्टैम्प 30 मिनट के भीतर है या नहीं।

कुकीज़ का प्रयोग करें

  • जब उपयोगकर्ता लॉग इन करता है तो कुकी में रहस्य जोड़ें।
  • सर्वर पर कुकी भेजने के लिए रिएक्ट एप्लिकेशन में क्रेडेंशियल के साथ उपयोग करें
  • बीच में डेटाबेस में देखने के बजाय कुकी की जाँच करें

रहस्य को रेडिस में ले जाएं

  • जब उपयोगकर्ता लॉग इन करता है, तो एक्सपायर प्रॉपर्टी के साथ रेडिस में सीक्रेट जोड़ें।
  • बेयरर के रूप में प्रतिक्रिया से रहस्य भेजें
  • मिडलवेयर में उपयोगकर्ता की जांच करने के लिए रेडिस में रहस्य देखें।

प्रमाणीकरण और प्राधिकरण में समग्र रूप से कुछ संकेत:

  • प्रत्येक अनुरोध पर एक पूर्ण लेनदेन संबंधी डेटाबेस पढ़ना महंगा है।
  • सत्र राज्य डेटा-हानि सहनशील है, इससे कोई फर्क नहीं पड़ता कि यह खो जाता है, आप इसे हमेशा पुनः बना/पुनर्स्थापित कर सकते हैं।
  • आपको कभी भी सीक्रेट या टोकन को लोकलस्टोरेज में स्टोर नहीं करना चाहिए, क्योंकि यह क्लाइंट पर है और इसलिए अन्य एप्लिकेशन द्वारा एक्सेस किया जा सकता है।
1
Bergur 5 फरवरी 2021, 14:18

शायद कुछ ऐसा

setTimeout(function(){ req.session.destroy(); }, milliseconds_since_page_loaded);

या req.session.destroy() का उपयोग करें; जहां भी यह सबसे अच्छा फिट बैठता है। मुझे यकीन नहीं है कि जब आप टाइमआउट करना चाहते थे तो मैं पूरी तरह समझ गया था।

हो सकता है कि आपके पास अंतिम कॉल के बाद से समय के रूप में एक चर सेट हो और फिर हर मिनट इसे ++ दें, फिर अपने किसी भी फ़ंक्शन में जोड़ें जो इसे रीसेट करने के लिए कॉल करता है, और हर 30 मिनट/हालांकि यह उस चर की जांच करता है। मैं इसके लिए कोड लिखने की कोशिश करूंगा लेकिन मुझे लगता है कि मुझे आज के लिए ब्रेक की जरूरत है। मैं यह देखने के लिए जल्द ही वापस जाँच करने की कोशिश करूँगा कि क्या इससे पर्याप्त मदद मिली है

0
Brandon Kauffman 31 जिंदा 2021, 01:46