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

यहाँ मेरा सत्यापन-टोकन.जेएस (मिडलवेयर) है:

const jwt = require("jsonwebtoken");

module.exports = (req, res, next) => {
  try {
    const token = req.headers.authorization.split(" ")[1];
    const decodedToken = jwt.verify(token, "secret_key");
    req.userData = decodedToken;
    next();
  } catch (error) {
    return res.status(401).send({
      message: "Auth failed"
    });
  }
};

और यहां मेरा लॉगिन कोड है (मैं यहां टोकन बना रहा हूं) यदि पासवर्ड सत्य है:

const token = jwt.sign(
  {
    email: user.email,
    password: user.password
  },
  "secret_key",
  {
    expiresIn: "2h"
  }
);

return res.status(200).send({ message: "success", token: token });

और app.js में:

const checkAuth = require('../middleware/checkauth');
router.get('/api/company',checkAuth,companyController.list);

मैं उम्मीद करता हूं कि एक टोकन सिर्फ एक उपयोगकर्ता के लिए होना चाहिए, और प्रत्येक लॉगिन के लिए इसे सभी उपयोगकर्ताओं के लिए एक नया टोकन बनाना चाहिए। किसी भी सुझाव?

0
Minel Aydın 30 अक्टूबर 2019, 20:49

1 उत्तर

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

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

यह सुनिश्चित करने के लिए कि दो लोग एक ही समय में एक ही टोकन का उपयोग नहीं करते हैं, आप प्रत्येक वैध टोकन की सूची बना सकते हैं जब आप इसे उत्पन्न करते हैं, और जब एक टोकन समाप्त हो जाता है या निरस्त हो जाता है (उदाहरण के लिए, जब उपयोगकर्ता साइन आउट करता है या रिपोर्ट करता है धोखेबाज, अगर यह इतना दूर हो जाता है) इसे सूची से हटा दें। सत्यापन के दौरान, यदि टोकन सूची में नहीं है, तो इसे डीकोड करने की भी जहमत न उठाएं, बस इसे तुरंत अस्वीकार कर दें।

यदि आप अपने टोकन को शालीनता से छोटी समाप्ति विंडो देते हैं (मेरा मानना ​​​​है कि सिफारिश उन्हें 1 घंटे से अधिक समय तक चलने की नहीं है), तो आपको ऐसी चीजों के बारे में ज्यादा चिंता करने की ज़रूरत नहीं है।

संपादित करें स्पष्ट करने के लिए, आपके पास यह सुनिश्चित करने का कोई तरीका नहीं होगा कि जिस व्यक्ति ने आपको टोकन दिया है, वह वही है जो वे होने का दावा करते हैं। आप केवल यह जानते हैं कि क्या आपके सर्वर ने टोकन बनाया है और यदि टोकन वर्तमान में मान्य है। यदि आप वास्तव में रीप्ले हमलों को रोकना चाहते हैं (अर्थात, पूरी तरह से सुनिश्चित करें कि दो लोगों के लिए एक ही टोकन का एक साथ उपयोग करने का कोई तरीका नहीं है), तो आपको हर बार उपयोग किए जाने पर एक नया टोकन जेनरेट करना होगा। यदि आप उस श्वेतसूची को रखते हैं जिसका मैंने ऊपर उल्लेख किया है, तो यह पुनर्जनन सुनिश्चित करता है कि एक बार उपयोग किए जाने पर प्रत्येक टोकन अमान्य हो जाए।

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

3
IceMetalPunk 30 अक्टूबर 2019, 18:28