passport-local ile node-jwt-simple


87

Başarılı kimlik doğrulamasında bir JWT jetonunu iade etmek için pasaport-yerel'i nasıl birleştirebilirim?

Kullanmak istediğim düğüm-jwt-basit ve bakarak passport.js Emin konuda nasıl değilim.

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);
    });
  }
));

Done () çağrılırken belirteci iade edilebilir mi? Bunun gibi bir şey ... (sadece sözde kod)

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

Değilse, jetonu nasıl iade edebilirim?

Yanıtlar:


123

Bunu anladım!

Öncelikle doğru stratejiyi uygulamanız gerekir. Benim durumumda LocalStrategy ve doğrulama mantığınızı sağlamanız gerekiyor. Mesela pasaport-yerelde olanı kullanalım.

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);
    });
  }
));

Sağladığınız doğrulama geri araması function(username, password, done), kullanıcınızı bulmanızı ve şifrenin eşleşip eşleşmediğini kontrol etmenizi sağlayacaktır (sorunun ve cevabımın kapsamı dışında)

passport.js, çalışması için birkaç parça bekler, birincisi, kullanıcıyı stratejide iade etmenizdir. Kodun o kısmını değiştirmeye çalışıyordum ve bu yanlıştı. Geri arama false, doğrulama başarısız olursa ve objectbaşarılı olursanız (doğrulanmış kullanıcı) bekler .

Şimdi .... JWT nasıl entegre edilir?

Giriş rotanızda, başarılı veya başarısız bir kimlik doğrulaması yapmanız gerekecektir. Ve burada JWT jetonu oluşturmayı eklemeniz gerekir. Şöyle:

(oturumu devre dışı bırakmayı unutmayın, aksi takdirde serileştirme ve seriyi kaldırma işlevlerini uygulamanız gerekir. Oturumu devam ettirmiyorsanız bunlara ihtiyacınız olmaz, eğer belirteç tabanlı bir kimlik doğrulama kullanmıyorsanız)

Pasaport yerel örneklerinden: (JWT jetonu eklenmiş olarak)

// 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);
});

Ve işte bu! Şimdi aradığınızda / giriş yaptığınızda ve POST kullanıcı adı ve şifresini (her zaman SSL üzerinden olmalıdır) aradığınızda, yukarıdaki ilk kod parçacığı, sağladığınız kullanıcı adına göre bir kullanıcı bulmaya çalışacak ve ardından şifrenin eşleşip eşleşmediğini kontrol edecektir (Tabii ki, bunu ihtiyaçlarınıza uyacak şekilde değiştirin).

Bundan sonra oturum açma rotanız aranacak ve orada bir hata veya geçerli bir belirteç döndürmeyle ilgilenebilirsiniz.

Umarım bu birine yardımcı olur. Ve eğer herhangi bir hata yaptıysam veya bir şeyi unuttuysam bana haber ver.


3
Passport'un Temel Stratejisi veya Özet Stratejisi diğer iki seçenektir. Bununla birlikte, Temel ve Yerel stratejiler arasında çok büyük bir fark yok gibi görünüyor, çünkü ikisi de çalışmak için oturumlara ihtiyaç duymuyor - sadece Yerel'in yönlendirme URL'leri istemesi (onu biraz daha az API dostu yapıyor).
funseiki

1
Hey @cgiacomi, jetonu kontrol eden bir rota örneği verebilir misiniz?
Matt Kim

3
Hey @ matt-kim aslında belirteci kaydetmiyorum, bu geçici. Bunun en iyi yol olup olmadığını bilmiyorum ama benim yaptığım bu: Kullanıcı kimlik doğrulamasını yapıyor ve belirteci oluşturup istemciye iade ediyorum. İstemci bir web sitesiyse belirteç localStorage'da saklanır veya bir iPhone / Android uygulamasında saklayabilirsiniz. Bir istemcinin bir kaynak için talepte bulunması gerektiğinde, kaydedilen jetonu arka uca gönderir. Pasaport, jetonu idare edecek. Token gist.github.com/cgiacomi/cd1efa187b8cccbe2a61 Taşıyıcı stratejisinin ana fikrini burada bulabilirsiniz. Bunun yardımcı olacağını umuyoruz! :)
cgiacomi

1
Hey @cgiacomi! belki bu açıktır, ancak özel geri aramayı kullanırken oturumları nasıl devre dışı bıraktığınızı açıklayabilir misiniz?
MrMuh

2
@MrMuh bağlantısını kontrol edin gist.github.com/cgiacomi/cd1efa187b8cccbe2a61 yorumumda oturumları nasıl devre dışı bırakacağımı gösteriyorum: passport.authenticate ('taşıyıcı', {oturum: false})
cgiacomi

18

Bu harika bir çözüm, şunu eklemek istiyorum:

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

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

Simgeyi doğrulamak için "express-jwt" kullanmayı seviyorum .

btw: Bu makale, her istekte geri göndermek için token'ı Angular kullanarak istemci tarafında nasıl kullanacağınızı öğrenmek için harika

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


2
Eskiden yalnızca express-jwtkimlik doğrulaması yapardım, ancak diğer paketlerin belgelerini okurdum, örneğin passport-jwt, bağlı kalacağımı düşünüyorum express-jwt. Çok daha basit, çok daha güzel IMO
bobbyz

Sadece bir FYI express-jwt, yenileme belirteçleri için destek sağlamaz.
user3344977

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.