Saya menemukan jawabannya!
Pertama-tama Anda perlu menerapkan strategi yang benar. Dalam kasus saya, LocalStrategy, dan Anda perlu memberikan logika validasi Anda. Sebagai contoh, mari gunakan yang di paspor-lokal.
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);
});
}
));
verifikasi panggilan kembali yang Anda berikan function(username, password, done)
akan mengurus menemukan pengguna Anda dan memeriksa apakah kata sandi cocok (di luar cakupan pertanyaan dan jawaban saya)
passport.js mengharapkan beberapa bagian agar berfungsi, salah satunya adalah Anda mengembalikan pengguna dalam strategi. Saya mencoba mengubah bagian kode itu, dan itu salah. Callback mengharapkan false
jika validasi gagal danobject
(pengguna yang divalidasi) jika Anda berhasil.
Sekarang .... bagaimana cara mengintegrasikan JWT?
Dalam rute login Anda, Anda harus menangani autentikasi yang berhasil atau yang tidak berhasil. Dan di sinilah Anda perlu menambahkan pembuatan token JWT. Seperti:
(ingat untuk menonaktifkan sesi, jika tidak Anda harus mengimplementasikan fungsi serialize dan deserialize. Dan Anda tidak memerlukannya jika Anda tidak mempertahankan sesi, yang tidak Anda lakukan jika menggunakan token berbasis auth)
Dari contoh paspor-lokal: (dengan token JWT ditambahkan)
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' });
}
var token = jwt.encode({ username: 'somedata'}, tokenSecret);
res.json({ token : token });
})(req, res, next);
});
Dan itu dia! Sekarang ketika Anda memanggil / masuk dan POST nama pengguna dan kata sandi (yang harus selalu melalui SSL) potongan kode pertama di atas akan mencoba menemukan pengguna berdasarkan nama pengguna yang Anda berikan dan kemudian memeriksa apakah kata sandi cocok (Tentu saja Anda perlu ubah itu agar sesuai dengan kebutuhan Anda).
Setelah itu, rute masuk Anda akan dipanggil dan di sana Anda dapat menangani pengembalian kesalahan atau token yang valid.
Semoga ini bisa membantu seseorang. Dan jika saya telah membuat kesalahan atau lupa sesuatu beri tahu saya.
Ini adalah solusi yang bagus, saya hanya ingin menambahkan ini:
var expressJwt = require('express-jwt'); app.use('/api', expressJwt({secret: secret}));
Saya suka menggunakan "express-jwt" untuk memvalidasi token.
btw: artikel ini sangat bagus untuk mempelajari cara menangani token di sisi klien, menggunakan Angular, untuk mengirimkannya kembali dengan setiap permintaan
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
sumber
express-jwt
melakukan otentikasi, tetapi membaca dokumentasi paket lain sepertipassport-jwt
, saya pikir saya akan tetap menggunakannyaexpress-jwt
. Jauh lebih sederhana, IMO jauh lebih baikInilah boiler-plate yang saya kerjakan secara khusus hanya menggunakan token api (tidak ada sesi ... bukan sesi itu buruk tentu saja; hanya kami menggunakan pendekatan token): https://github.com/roblevintennis/passport -api-token
sumber