0

所以我正在使用 passportJs JWT 实现基本的登录/注册。我使用的框架是 node.js 的 express。问题是我正在注册一个用户,它工作正常,因为它通过 Postman 注册,我可以在 mongodb shell 中使用db.users.find(). 但是,当我发出 POST 请求以验证用户身份时,当我将 JSON(应用程序/json)更改为文本时,它会给我“未找到用户”。否则它会挂起并在一段时间后终止。

应用程序.js

   const app = express();

   const users = require('./routes/users');

   //port
   const port = 3000;

   //middleware
   app.use(cors());

   //Front
   app.use(express.static(path.join(__dirname,'public')));

   //middleware
   app.use(bodyParser.json());

   app.use(passport.initialize());
   app.use(passport.session());

   require('./config/passport')(passport);

护照.js

module.exports = function(){
    let opts = {};
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
    opts.secretOrKey = 'secret';
    passport.use(new JwtStrategy(opts , (jwt_payload, done) => {
        User.getUserById(jwt_payload._id, (err, user) =>{
            if(err){
                return done(err, false);
            }
            if(user){
                return done(null, user);
            }
            else{
                return done(null, false);
            }
        })
    }));
}

用户.js

router.post('/authenticate', (req,res,next) =>{
    const email = req.body.email;
    const password = req.body.password;

    User.getUserByemail(email, (err, user) => {
        if(err) throw err;
        if(!user){
            return res.json({success: false,msg:'user Not Found'});
        }
        User.comparePassword(password,user.password, (err, isMatch) => {
            if(err){
                if(isMatch()){
                    const token = jwt.sign(user,'secret', {
                        expiresIn: 86400 // 1 Day
                    });
                    res.json({
                        success: true,
                        token: 'JWT ' +token,
                        user:{
                            id: user._id,
                            name: user.fname+ ' ' + user.lname,
                            email: user.email
                        }
                    });
                }
                else{
                    return res.json({success: false,msg:'Wrong Password'});
                }
            }
        });
    });
});

用户.js

module.exports.getUserByemail = function(email, callback){
    const query = {email: email}
    User.findOne(query,callback);
}
4

1 回答 1

0

从我看到的代码来看,护照与您的错误无关,因为您的/authenticate路线是公开的(不使用护照中间件),因此我们可以将其排除在外。

我建议仔细检查/记录req.body并查看您是否在 API 函数中获得了正确的信息,我很确定数据是错误的,特别是因为您正在谈论请求格式 text/json。

于 2019-05-31T08:14:37.687 回答