我前段时间开始了一个node项目,使用Node、Express、MongoDB和Passport使用passport-local-mongoose使用会话进行用户认证,我的用户模型是这样的。
const mongoose = require("mongoose");
const passportLocalMongoose = require("passport-local-mongoose");
var UserSchema = new mongoose.Schema({
username: String,
email: String,
password: String,
//etc
});
UserSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("User", UserSchema);
现在我想为同一个webapp创建一个react native app,所以我想使用相同的用户数据库。
我的问题是:我可以在网站上现有的用户模型和认证策略旁边使用类似 passport-jwt 的东西吗?还是你们建议我重新创建一个完整的项目,只用jsonwebtokens来进行auth,然后尝试导入当前的用户DB?
谢谢!
你可以使用相同的db实现一个新的策略。创建一个passport.js文件,并启动你想为该用户使用的策略类型。从那里你可以调用相同的模型,并从相同的db中检查该用户的auth。你还需要在模型中写一个comparePassowrd函数。这样你就可以比较你的登录密码和会话将被维护到web前端。
passport.use('user',new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
}, function (username, password, done) {
Collection.findOne({username: username}, (err, user) => {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, {"user not found"});
}
user.comparePassword(password, (err, isMatch) => {
if (err) {
return done(err);
}
if (!isMatch) {
return done(null, false, {"wrong password"});
}
return done(null, user);
});
});
}
));
在passport.js中添加isAuthenticated和isAuthorized函数。
passport.isAuthenticated = (req, res, next) => {
if (req.isAuthenticated()) {
return next();
}
res.status(401);
return next({"user not authenticated"});
};
passport.isAuthorized = (userType) => {
return (req, res, next) => {
if (req.user.userType == userType) {
return next();
}
res.status(403);
return next({"user not authorized"});
};
};
这里的userType是指不同级别的用户,例如:管理员、版主等。
现在,在路由中,在进入实际函数之前,只需调用auth函数。
app.post('/apiRoute',passport.isAuthenticated, passport.isAuthorized('ADMIN'),controllerFile.actualFunction;