带有ajax的本地护照不使用会话

时间:2016-05-18 20:18:53

标签: javascript node.js authentication passport.js passport-local

当执行异步登录到本地护照时,我的会话永远不会存储用户,并且永远不会调用序列化。

因为我在登录时没有重定向(我只是通过对他们的ajax调用的响应通知用户)我想我必须在登录时手动触发序列化?我不确定当用户刷新时会话如何将用户关联起来。这是我主要担心的问题,因为我的用户从未将主页留在我的用例中,但是我希望他们在刷新后保持登录一段时间(除非他们明确注销)。

我在使用ajax登录时如何才能导致护照保存会话?

配置

app.use(require('express-session')({secret:'secret'}));
app.use(passport.initialize());
app.use(passport.session());

app.get('/', function(req, res) {
    res.render('index', {
        user: req.user // undefined here, although req.session does exist. req.session.passport does not exist.
    });
});

app.post('/login', function(req, res, next) {
    passport.authenticate('local-login', {}, function(error, user, info) {
        if (error) {
            return res.status(500).json(error);
        }
        if (!user) {
            return res.status(401).json(info);
        }
        res.json({user: user});
    })(req, res, next);
});

登录电话,客户端

$.ajax({
    url: "/login",
    type: "POST",
    contentType: "application/json",
    data: '{"email":"a@b.c", "password":"abc"}',
    cache: false,
    timeout: 5000,
    success: function(data) {
        data.user; // valid, this comes back.
    }
});

序列化(从未调用)

passport.serializeUser(function(user, done) {
    console.log('serialize user:', user); // never called
    done(null, user);
});

passport.deserializeUser(function(id, done) {
    console.log('deserializeUser user:', user); // never called
    User.findById(id, function(err, user) {
        console.log('deserializeUser user (done):', user);
        done(err, user);
    });
});

策略

var onLocalLoginStrategy = function(req, email, password, done) {
    User.findOne({
        'local.email': email.toUpperCase()
    }, function(err, user) {
        if (err)
            return done(err);

        if (!user)
            return done(null, false, { message:'No user found.'} );

        if (!user.validPassword(password))
            return done(null, false, { message: 'Incorrect password.' });

        return done(null, user);
    });
};

0 个答案:

没有答案