2016-01-30 6 views
5

मैं कुछ हफ्ते पहले सेल्स के साथ काम कर रहा हूं, मैं रेल से आया हूं और मेरे पास नोड.जे.एस. के साथ काम करने का कोई अनुभव नहीं है।Sails.js में jsonwebtoken का उपयोग कर वर्तमान उपयोगकर्ता को कैसे प्राप्त करें?

अब मैं jsonwebtoken का उपयोग करके एक मजबूत टोकन प्रमाणीकरण करने की कोशिश कर रहा हूं। https://github.com/auth0/node-jsonwebtoken

मैंने इस गाइड का पालन किया http://thesabbir.com/how-to-use-json-web-token-authentication-with-sails-js/ और सब ठीक काम किया। मैं साइन अप करने में सक्षम हूं, साइन इन करता हूं और फिर विभिन्न कार्यों के लिए टोकन का सही उपयोग करता हूं।

अब, कुछ क्रियाएं हैं जहां मैं लॉगिन उपयोगकर्ता, का उपयोग करना चाहूंगा जैसे current_user सहायक। उदाहरण के लिए, जब कोई टिप्पणी बनाते हैं, तो यह टिप्पणी वर्तमान उपयोगकर्ता से संबंधित होनी चाहिए।

सब्बीर अहमद गाइड का उपयोग, isAuthorized.js नीति से 33 लाइन में टोकन डिक्रिप्ट हो जाता है, इसलिए मैं वहां से वर्तमान उपयोगकर्ता आईडी प्राप्त कर सकता हूं।

तो, मेरा सवाल यह है कि वर्तमान उपयोगकर्ता को प्राप्त करने का सबसे अच्छा तरीका क्या होना चाहिए और बाद में कुछ नियंत्रक में इसका उपयोग करने में सक्षम होना चाहिए? उदाहरण के लिए मैं कुछ ऐसा करने की कोशिश की:

# isAuthorized.js line 34, after getting decrypted token 
User.findOne({id: token.id}).exec(function findOneCB(err, found){ 
    currentUser = found; 
}); 

लेकिन, इस रास्ते पर है, क्योंकि यह एक async कार्रवाई है मैं एक नियंत्रक में इस currentUser उपयोग नहीं कर सकते।

मैं वर्तमान उपयोगकर्ता को कुछ नियंत्रक में बाद में उपयोग करने में सक्षम होने के लिए प्रत्येक नियंत्रक में एक ही कोड दोहराए बिना, एक सहायक या शायद एक सेवा की तरह कुछ भी स्टोर करना चाहता हूं।

उत्तर

4

यह चाल है जहां आप next() डालते हैं। चूंकि आप एसिंक कॉल कर रहे हैं, इसलिए डाटाबेस एक्शन प्रतिस्पर्धा के बाद नियंत्रण को केवल अगली पॉलिसी/कंट्रोलर में स्थानांतरित किया जाना चाहिए।

आप के लिए नीति को संशोधित करना चाहिए:

User.findOne({id: token.id}).exec(function findOneCB(err, found){ 
    if(err) next(err); 
    req.currentUser = found; 
    next(); 
}); 

और तुम नियंत्रकों कि के माध्यम से req.currentUser

0

तो द्वारा

उदाहरण के लिए isAuthorized नीति का उपयोग में उपयोगकर्ता जानकारी का उपयोग करने के लिए सक्षम होना चाहिए , जब कोई टिप्पणी बनाते हैं, तो यह टिप्पणी वर्तमान उपयोगकर्ता से संबंधित होनी चाहिए।

तुम क्या मतलब उपयोगकर्ता नाम की तरह कुछ विशेषताओं, और देश आदि, सत्यापन के बाद डेटाबेस क्वेरी करने के बजाय, आप क्या करना चुन सकते हैं api/controllers/UsersController.js

में jwToken.issue करने के लिए इन अतिरिक्त गुण भेजने के लिए है

उदाहरण के लिए।

jwToken.issue({ 
    id: user.id, 
    username: user.name, 
    country: user.country 
    }) 

कि कैसे मदद करता है, है आप api/policies/isAuthorized.js रख सकते के रूप में है, और सभी नियंत्रकों कि आप भविष्य में उपयोग में है, तो आप इसके बजाय के लिए होने के रूप में से

token.username or token.country 

पेलोड मूल्यों का उपयोग कर सकते डेटाबेस को दोबारा पूछें, जिससे आपको मूल्यवान प्रतिक्रिया समय बचाया जा सके।

लेकिन खबरदार, डेटा की आप (आप भी भेज सकते हैं {उपयोगकर्ता: उपयोगकर्ता} यदि आप चाहते हैं) टोकन में भेजने का विकल्प चुन तथापि, गुप्त कुंजी या हैशिंग के रूप में के रूप में पेलोड को डिक्रिप्ट करने की आवश्यकता नहीं है आप @jwt.io को चित्रित कर सकते हैं, आप संयम का प्रयोग करना चाह सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे