1. 安装 passport
npm i passport
npm i passport-local
2. 添加模块(上面几个为依赖模块)
var cookieParser = require ('cookie-parser' );
var bodyParser = require ('body-parser' );
var session = require ('express-session' );
var MongoStore = require ('connect-mongo' )(session);
var passport = require ('passport' );
var LocalStrategy = require ('passport-local' ).Strategy;
3. 实现一些基本回调
passport.serializeUser(function (user, done) {
done(null , user.id);
});
passport.deserializeUser(function (id, done) {
UserModel.findById(id, function (err, user) {
done(err, user);
})
});
4. 使用本地策略
passport.use (new LocalStrategy(function (username, password, done) {
UserModel.findOne({
username: username
}, function (err, user) {
if (err) {
return done(err);
} else {
if (!user) {
return done(null , false , {
message: '用户名不存在'
});
}
if (!user.password == password) {
return done(null , false , {
message: '密码不匹配'
});
}
return done(null , user);
}
});
}));
5. login时,通过logIn方法设置状态
app.post('/login' , function (req, res, next) {
passport.authenticate('local' , function (err, user, info) {
if (err) {
return next (err);
}
if (!user) {
return res.redirect('/login' );
}
// res.redirect('/users' );
req.logIn(user, function (err) {
if (err) {
return next (err);
}
return res.redirect('/users' );
});
})(req, res, next );
});
6. 将passport中自定义的req.isAuthenticated 封装为插件
var isAuthenticated = function (req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login' );
}
7. 设置session保存至数据库
app.use(session({
resave: false ,
saveUninitialized: true ,
cookie: {
maxAge: 3600000
},
secret: "robin shop" ,
store: new MongoStore({
url:'mongodb://localhost/emberExpressMongoDB'
})
}));
8. 初始化passport
app.use(passport.initialize());
app.use(passport.session());
9. 路由中的使用
app.use('/users' , isAuthenticated, users);