Mam problem z modułem Passport.js i Express.js.
To jest mój kod i chcę tylko użyć zakodowanego logowania przy pierwszej próbie.
Zawsze dostaję wiadomość:
Szukałem dużo i znalazłem kilka postów w stackoverflow, ale nie udało mi się.
Error: failed to serialize user into session
at pass (c:\Development\private\aortmann\bootstrap_blog\node_modules\passport\lib\passport\index.js:275:19)
Mój kod wygląda tak.
'use strict';
var express = require('express');
var path = require('path');
var fs = require('fs');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var nodemailer = require('nodemailer');
var app = express();
module.exports = function setupBlog(mailTransport, database){
var config = JSON.parse(fs.readFileSync('./blog.config'));
app.set('view options', {layout: false});
app.use(express.static(path.join(__dirname, '../', 'resources', 'html')));
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: 'secret' }));
app.use(passport.initialize());
app.use(passport.session());
app.get('/blog/:blogTitle', function(req, res) {
var blogTitle = req.params.blogTitle;
if(blogTitle === 'newest'){
database.getLatestBlogPost(function(post) {
res.send(post);
});
} else {
database.getBlogPostByTitle(blogTitle, function(blogPost) {
res.send(blogPost);
});
}
});
passport.use(new LocalStrategy(function(username, password, done) {
// database.login(username, password, done);
if (username === 'admin' && password === 'admin') {
console.log('in');
done(null, { username: username });
} else {
done(null, false);
}
}));
app.post('/login', passport.authenticate('local', {
successRedirect: '/accessed',
failureRedirect: '/access'
}));
app.listen(8080);
console.log('Blog is running on port 8080');
}();
Dzięki.
node.js
express
login
passport.js
passport-local
user2244925
źródło
źródło
serializeUser
funkcja przechowuje tylko identyfikator użytkownika w sesji ideserializeUser
używa tego identyfikatora do pobierania danych użytkownika z bazy danych (na przykład). Ma to na celu zapobieżenie, aby pamięć sesji zawierała same dane użytkownika.Jeśli zdecydujesz się nie używać sesji, możesz ustawić sesję na fałsz
źródło
Wygląda na to, że przegapiłeś część konfiguracji paszportjs, a konkretnie te dwie metody:
Dodałem trochę o
._id
vs.,.id
ale ten fragment pochodzi z sekcji Konfiguruj dokumentów, daj mu jeszcze jedną lekturę i powodzenia :)źródło
Oto działający, ale wciąż leniwy sposób na wykorzystanie sesji i nadal „serializowanie” wartości.
w przypadku dziwnych błędów zadaj sobie pytanie: „Czy mam rlly ustawić '_id' w obiekcie użytkownika?” - w większości przypadków nie. Więc użyj odpowiedniego atrybutu jako klucza.
źródło
Używanie Promise z serializeUser i deserializeUser:
Zobacz moje repozytorium na githubie, aby uzyskać pełny przykład kodu, jak rozwiązać ten problem.
źródło
in passport.use ('local-login' ...) / lub / ('local-singup' ...)
jeśli err musisz zwrócić "false" err {return done (null, req.flash ('megsign', 'Username już istnieje #! #'));} true {return done (null, false, req.flash (' megsign ',' Nazwa użytkownika już istnieje #! # '));}
źródło