Node.js 使用同一用户模型的第二个passport策略?
不久前,我启动了一个节点项目,使用node、Express、MongoDB和Passport使用Passport local mongoose进行用户身份验证使用会话,我的用户模型如下所示:Node.js 使用同一用户模型的第二个passport策略?,node.js,mongoose,passport.js,Node.js,Mongoose,Passport.js,不久前,我启动了一个节点项目,使用node、Express、MongoDB和Passport使用Passport local mongoose进行用户身份验证使用会话,我的用户模型如下所示: const mongoose = require("mongoose"); const passportLocalMongoose = require("passport-local-mongoose"); var UserSchema = new mongoose.Schema({ username
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原生应用程序,所以我想使用相同的用户数据库
我的问题是:我可以在网站上现有的用户模型和身份验证策略的基础上使用passport jwt之类的工具吗?或者你们建议我只使用jsonwebtokens for auth重新创建完整的项目,然后尝试导入当前用户数据库
谢谢 您可以使用相同的数据库实施新策略。创建一个passport.js文件,并启动要用于该用户的策略类型。从那里,您可以调用相同的模型,并从相同的数据库检查该用户的身份验证。您还需要在模型中编写ComparePassword函数。因此,您可以比较您的登录密码,并为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和isAuthenticated函数
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用于不同级别的用户,例如:管理员/版主等
现在在route中,只需在转到实际函数之前调用auth函数
app.post('/apiRoute',passport.isAuthenticated, passport.isAuthorized('ADMIN'),controllerFile.actualFunction;