使用同一个User模型,使用第二个passport策略?

问题描述 投票:0回答:1

我前段时间开始了一个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?

谢谢!

node.js mongoose passport.js
1个回答
1
投票

你可以使用相同的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;
© www.soinside.com 2019 - 2024. All rights reserved.