前段时间,我使用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);
现在,我想为同一个Web应用程序创建React Native应用程序,所以我想使用相同的用户数据库。
我的问题是:我可以在网站上使用像passport-jwt这样的东西以及当前的用户模型和身份验证策略吗?还是你们建议我仅使用jsonwebtokens进行身份验证来重新创建整个项目,然后尝试导入当前的用户数据库?
谢谢!
答案 0 :(得分:1)
您可以使用同一数据库实施新策略。创建一个passport.js文件并启动您要用于该用户的策略类型。从那里,您可以调用相同的模型,并从同一数据库检查该用户的身份验证。您还需要在模型中编写一个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);
});
});
}
));
在password.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用于不同级别的用户,例如:admin /主持人等
现在,在路由中只需调用auth函数,然后再移至实际函数
app.post('/apiRoute',passport.isAuthenticated, passport.isAuthorized('ADMIN'),controllerFile.actualFunction;