8

Node用のExpressフレームワークを使用して最初のステップを実行しようとしています。Passportを使用して、小さな認証の例を実装しようとしていました。しかし、私はそれを機能させることはできません。エラーが発生し続けます:Error: failed to serialize user into session

node-inspectorをインストールして、何が起こっているのかを確認しました。どうやら、私のシリアル化関数が呼び出されておりdone(null, 0)、期待どおりに実行されています。パスポートのコードを見てみましたが、何が問題なのかわかりませんでした。これは、Nodeアプリケーションでの私の最初の試みであるため、コードに精通していません。誰かが私にヒントを与えることができますか?ありがとう。

var express = require('express');
var jade = require('jade');

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

var app = express();

/*
 * Settings
 */

app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');

    app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.session({ secret: 'cat in the bag' }));
    app.use(passport.initialize());
    app.use(passport.session());

    passport.use(new LocalStrategy(
        function(username, password, done) {
            done(null, { id: 0, username: 'juancito' });
        }
    ));

    passport.serializeUser(function(user, done) {
        done(null, user.id);
    });

    passport.deserializeUser(function(id, done) {
        done(null, 'juancito');
    });
});



/*
 * Routes
 */

app.get('/', function(req, res) {
    res.render('index', { title: 'Welcome!' });
});

app.get('/login', function(req, res) {
    if (req.user)
        return res.redirect('/');

    res.render('login', { title: 'Log in' });
});

app.post('/login',
    passport.authenticate('local', {
        successRedirect: '/',
        failureRedirect: '/login'
    })
);

app.get('/logout', function(req, res) {
    req.logOut();
    res.redirect('/');
});

app.listen(3000);
console.log('Listening on port 3000.');
4

2 に答える 2

11

問題は0、JavaScriptのfalse-y値であるため、Passportはユーザーをシリアル化していないと見なします。

done(null, 0)  // don't serialize users to a 0 number

ユーザーIDを1から開始することをお勧めします(SQLデータベースで発生します)。または(本当に0から始まる整数が必要な場合は)それらを文字列としてセッションにシリアル化します。

done(null, 0.toString())
于 2012-10-23T17:46:10.343 に答える
5

たぶん、passport.initialize()とpassport.session()を呼び出す前に、シリアル化/逆シリアル化コールバックを割り当てる必要があります。

passport.use(new LocalStrategy(
    function(username, password, done) {
        done(null, { id: 0, username: 'juancito' });
    }
));

passport.serializeUser(function(user, done) {
    done(null, user.id);
});

passport.deserializeUser(function(id, done) {
    done(null, 'juancito');
});

app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');

    app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.session({ secret: 'cat in the bag' }));
    app.use(passport.initialize());
    app.use(passport.session());

});
于 2012-10-23T06:43:22.517 に答える