नोड-जेडटीटी-सरल के साथ पासपोर्ट-स्थानीय


87

सफल प्रमाणीकरण पर JWT टोकन वापस करने के लिए मैं पासपोर्ट-स्थानीय को कैसे जोड़ सकता हूं?

मैं नोड- jwt-simple और passport.js को देखना चाहता हूं, मुझे यकीन नहीं है कि कैसे जाना है।

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

क्या कॉल करने पर टोकन वापस करना संभव है ()? कुछ इस तरह ... (सिर्फ छद्म कोड)

if(User.validCredentials(username, password)) {
  var token = jwt.encode({username: username}, tokenSecret);
  done(null, {token : token}); //is this possible?
}

यदि नहीं, तो मैं टोकन कैसे वापस कर सकता हूं?

जवाबों:


123

मैं यह समझ गया!

सबसे पहले आपको सही रणनीति को लागू करने की आवश्यकता है। मेरे मामले में LocalStrategy, और आपको अपना सत्यापन तर्क प्रदान करने की आवश्यकता है। उदाहरण के लिए, आइए पासपोर्ट-स्थानीय में एक का उपयोग करें।

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

आपके द्वारा प्रदान किया गया सत्यापित कॉल बैक function(username, password, done)आपके उपयोगकर्ता को खोजने और जाँच करेगा कि क्या पासवर्ड मेल खाता है (प्रश्न और मेरे उत्तर के दायरे से परे)

passport.js को उम्मीद है कि इसके कई टुकड़े काम करेंगे, एक यह है कि आप उपयोगकर्ता को रणनीति में वापस करते हैं। मैं कोड के उस हिस्से को बदलने की कोशिश कर रहा था, और यह गलत था। कॉलबैक उम्मीद करता है falseकि यदि सत्यापन विफल हो जाता है और object(मान्य उपयोगकर्ता) यदि आप सफल हैं।

अब .... जेडब्ल्यूटी को कैसे एकीकृत किया जाए?

अपने लॉगिन मार्ग में आपको एक सफल ऑर्टिकल या असफल असफल को संभालना होगा। और यह यहां है कि आपको JWT टोकन निर्माण को जोड़ने की आवश्यकता है। इस तरह:

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

पासपोर्ट-स्थानीय उदाहरणों से: (JWT टोकन के साथ)

// POST /login
//   This is an alternative implementation that uses a custom callback to
//   achieve the same functionality.
app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err) }
    if (!user) {
      return res.json(401, { error: 'message' });
    }

    //user has authenticated correctly thus we create a JWT token 
    var token = jwt.encode({ username: 'somedata'}, tokenSecret);
    res.json({ token : token });

  })(req, res, next);
});

और वह यह है! अब जब आप कॉल / लॉगिन और POST उपयोगकर्ता नाम और पासवर्ड (जो हमेशा SSL पर होना चाहिए) ऊपर दिए गए पहले कोड का स्निपेट आपके द्वारा प्रदान किए गए उपयोगकर्ता नाम के आधार पर एक उपयोगकर्ता को खोजने का प्रयास करेगा और फिर जांच करेगा कि पासवर्ड आपको मेल करना है (बेशक अपनी आवश्यकताओं के अनुरूप परिवर्तन करें)।

उसके बाद आपके लॉगिन मार्ग को कॉल किया जाएगा और वहां आप किसी त्रुटि या वैध टोकन को वापस लेने का ध्यान रख सकते हैं।

आशा है कि यह किसी की मदद करेगा। और अगर मैंने कोई गलती की है या कुछ भूल गया है तो मुझे बताएं।


3
पासपोर्ट के बेसिकस्ट्रेगी या डाइजेस्टस्ट्रेगी दो अन्य विकल्प हैं। बेसिक और लोकल स्ट्रेटेजी में बहुत बड़ा अंतर नहीं लगता है, हालाँकि, तब से न तो काम करने के लिए सेशन की जरूरत है - बस इतना ही कि लोकल रीडायरेक्ट यूआरएल मांगता है (इसे थोड़ा कम एपीआई फ्रेंडली बनाते हैं)।
funseiki

1
अरे @cgiacomi क्या आप एक मार्ग का उदाहरण दे सकते हैं जो टोकन की जांच करता है?
मैट किम

3
अरे @ मैट-किम वास्तव में मैं टोकन नहीं बचाता, यह क्षणिक है। मुझे नहीं पता कि यह सबसे अच्छा तरीका है या नहीं, लेकिन यह वही है जो मैं करता हूं: उपयोगकर्ता प्रमाणित करता है, और मैं टोकन उत्पन्न करता हूं और इसे क्लाइंट को वापस करता हूं। यदि ग्राहक एक वेबसाइट है, या आप इसे iPhone / Android ऐप में संग्रहीत कर सकते हैं, तो टोकन स्थानीयस्टोरेज में संग्रहीत है। जब किसी क्लाइंट को किसी संसाधन के लिए अनुरोध करना होता है तो वह बैकएंड में सेव्ड टोकन भेजता है। पासपोर्ट टोकन संभाल लेगा। यहाँ टोकन gist.github.com/cgiacomi/cd1efa187b8cccbe2a61 को संभालने के लिए बियरर रणनीति के साथ एक जिस्ट है। आशा है कि यह मदद करता है! :)
सियाजकोमी

1
हे @cgiacomi! शायद यह स्पष्ट है, लेकिन क्या आप बता सकते हैं कि कस्टम कॉलबैक का उपयोग करते समय आप सत्रों को कैसे अक्षम करते हैं?
मृमु।

2
@MrMuh लिंक चेकआउट gist.github.com/cgiacomi/cd1efa187b8cccbe2a61 : passport.authenticate ({झूठी सत्र} 'वाहक',:) मेरी टिप्पणी में मैं कैसे अक्षम सत्र को दिखाने
cgiacomi

18

यह एक महान समाधान है, मैं इसे जोड़ना चाहता हूं:

var expressJwt = require('express-jwt');

app.use('/api', expressJwt({secret: secret}));

मुझे टोकन को मान्य करने के लिए "एक्सप्रेस- jwt" का उपयोग करना पसंद है ।

btw: यह लेख क्लाइंट पक्ष में टोकन को संभालने के लिए सीखने के लिए बहुत अच्छा है, इसे आपके अनुरोध के साथ भेजने के लिए कोणीय का उपयोग करना

https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/


2
मैंने केवल express-jwtप्रमाणीकरण करने के लिए उपयोग किया है, लेकिन अन्य पैकेजों के प्रलेखन के माध्यम से पढ़ passport-jwtरहा हूं जैसे , मुझे लगता है कि मैं चिपके रहूंगा express-jwt। बहुत सरल, बहुत अच्छे आईएमओ
बॉबीज 23

बस एक FYI एक्सप्रेस-jwt ताज़ा टोकन के लिए समर्थन प्रदान नहीं करता है।
15:33 पर user3344977

3

यहाँ एक बॉयलर-प्लेट है जिस पर मैं विशेष रूप से केवल एपी टोकन का उपयोग करने के लिए काम कर रहा हूं (कोई सत्र नहीं ... यह सत्र निश्चित रूप से बुरा नहीं है; बस हम टोकन दृष्टिकोण का उपयोग कर रहे हैं): https://github.com/roblevintennis/passport -api-टोकन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.