使用相同的用户模型使用第二种护照策略?

时间:2019-08-30 14:43:33

标签: 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: String,
  email: String,
  password: String,
  //etc

});

UserSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("User", UserSchema);

现在,我想为同一个Web应用程序创建React Native应用程序,所以我想使用相同的用户数据库。

我的问题是:我可以在网站上使用像passport-jwt这样的东西以及当前的用户模型和身份验证策略吗?还是你们建议我仅使用jsonwebtokens进行身份验证来重新创建整个项目,然后尝试导入当前的用户数据库?

谢谢!

1 个答案:

答案 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;