1

Node.js Express アプリがあり、MongoStore を使用してセッションを保存し、認証のために Passport-local を使用しようとしています。アプリはセッションを保存していませんdb.sessions

app.js

var session = require("express-session");
var MongoStore = require("connect-mongo/es5")(session);
var passport = require('passport');

app.use(session({
    secret: 'secret',
    resave: false,
    saveUninitialized: false,
    duration: 30 * 60 * 1000,
    activeDuration: 5 * 60 * 1000,
    store: new MongoStore({
        url: MongoDB.MONGODB_URL
    })
})); 

app.use(passport.initialize());

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

passport.deserializeUser(function(id, done) {
    db.users.findById(id, function(err, user){
        if(!err) done(null, user);
        else done(err, null);
    });
});

localstrategy は次のように実装されます。MongoDBMongoDB と対話する私自身のモジュールです。

passport.use('local', new LocalStrategy({
        usernameField: 'email',
        passwordField: 'password'
},
    function (email, password, done) {
        process.nextTick(function () {
            MongoDB.collection("users").findOne({
                email: email
            }, function (error, doc) {
                if (error) {
                    return done(error);
                }
                if (doc) {
                    if (doc.password === PasswordManager.encryptPassword(password)) {
                        return done(null, doc);
                    } else {
                        return done("Invalid Password", false);
                    }
                }
            });
        });
    }
));

認証リクエスト。MongoStore セッションを使用しようとしているときに、オプション -{session: false}req.LogIn関数に渡しました。

router.post('/login', function (req, res, next) {
passport.authenticate('local', function (err, user) {
    if (err) {
        return next(err);
    }
    if (!user) {
        return res.status(401).send({
            success: false,
            error: "User not found!",
            data: null
        });
    }

        req.logIn(user, {session: false}, function (err) {
            if (err) {
                return next(err);
            }
            req.session.user = user;
            return res.send({
               success: true,
               error: null,
               data: user
           });
        })
    })(req, res, next);
});
4

0 に答える 0