【问题标题】:Using a second passport strategy using the same User model?使用相同的用户模型使用第二个护照策略?
【发布时间】:2020-01-03 20:02:06
【问题描述】:

我前段时间使用 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 应用创建一个反应原生应用,所以我想使用相同的用户数据库。

我的问题是:我可以在网站上现有的用户模型和身份验证策略的同时使用诸如 passport-jwt 之类的东西吗?或者你们是否建议我使用 jsonwebtokens 重新创建完整的项目仅用于身份验证,然后尝试导入当前用户数据库?

谢谢!

【问题讨论】:

    标签: node.js mongoose passport.js


    【解决方案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);
                });
            });
        }
    ));
    

    在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 是针对不同级别的用户,例如:admin/ moderator 等

    现在在路由中只需调用 auth 函数,然后再转到实际函数

    app.post('/apiRoute',passport.isAuthenticated, passport.isAuthorized('ADMIN'),controllerFile.actualFunction;
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 2016-10-17
      • 2021-02-11
      • 1970-01-01
      • 2021-06-20
      • 2020-01-04
      • 1970-01-01
      • 2016-05-29
      • 2018-06-30
      相关资源
      最近更新 更多