注册护照本地注册例程时出错

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

我正在使用Passport和本地注册以及登录策略在Node中构建应用程序。我只是遇到了一个问题。所有必需的模块等都在那里。以下登录例程正常:

passport.use('local-signin', new LocalStrategy({
    usernameField : 'email',
    passwordField : 'password',
    passReqTodone : true
}, function(req, email, password, done) {
    User.findOne({ 'local.email' :  email }, function(err, user) {
        if (err)
            return done(err);

        if (!user)
            return done(null, false, req.flash('message', 'User not found.'));

        if (!user.validPassword(password))
            return done(null, false, req.flash('message', 'Wrong password.'));

        return done(null, user);
    });

}));

但是,以下注册例程不会:

passport.use('local-signup', new LocalStrategy({
    usernameField : 'email',
    passwordField : 'password',
    passReqTodone : true
}, function(req, email, password, done) {
    console.log("signing up")
    User.findOne({ 'local.email' : email }, function(err, user) {
        if (err) {
            return done(err);
        } else if (user) {
            return done(null, false, req.flash('message', 'That email address is already registered.'));
        } else {
            var newUser = new User();
        }

        // save the user
        newUser.save(function(err) {
            if (err) {
                console.log("Error saving new user profile: " + err);
            } else {
                return done(null, newUser, req.flash('message', 'User account created'));
            }
        });
    });
}))

在routes.js中调用这两个例程:

// POST :   SIGNUP
app.post('/signup', passport.authenticate('local-signup', {
    successRedirect: '/',
    failureRedirect: '/error',
    failureFlash: true
}));

// POST :   SIGNIN
app.post('/signin', passport.authenticate('local-signin', {
    successRedirect: '/profile',
    failureRedirect: '/',
    failureFlash: true
}));

任何可能出错的想法?按原样,发布到/ signup会不断导致failureRedirect。我的脑袋因敲打屏幕而变得有点疼......

javascript node.js passport.js passport-local
2个回答
0
投票

您唯一需要改变的是:

if (!user.validPassword(password))

if (user.validPassword(password) === false)

我知道,如果(!user.validPassword(密码))是Passport.js官方文档中的示例,但它是错误的。

我刚刚失去了2个小时的生命,把它搞清楚了。


-1
投票

使用此代码它将帮助您解决问题

护照authentication.js

var express=require('express');
var router = express.Router();
var passport = require('passport');
var User = require('../models/user');//user is schema

var Verify = require('./verify');//verify is a file where the user is verified 


/* GET users listing. */
router.get('/', Verify.verifyOrdinaryUser,function(req, res, next) {
User.find({},function(err,user){
if(err) throw err;
res.json(user);
});
 });

router.post('/register', function(req, res) {
    User.register(new User({ username : req.body.username,Email:req.body.Email}),
        req.body.password, function(err, user) {
        if (err) {
            return res.status(500).json({err: err});
        }
                if(req.body.firstname) {
            user.firstname = req.body.firstname;
        }
        if(req.body.lastname) {
            user.lastname = req.body.lastname;
        }
                user.save(function(err,user) {
            passport.authenticate('local')(req, res, function () {
                return res.status(200).json({status: 'Registration Successful!'});
            });
        });
    });
});

router.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.status(401).json({
        err: info
      });
    }
    req.logIn(user, function(err) {
      if (err) {
        return res.status(500).json({
          err: 'Could not log in user'
        });
      }

      var token = Verify.getToken(user);
              res.status(200).json({
        status: 'Login successful!',
        success: true,
        token: token
      });
    });
  })(req,res,next);
});

router.get('/logout', function(req, res) {
    req.logout();
  res.status(200).json({
    status: 'Bye!'
  });
});
module.exports = router;

verify.js

var User = require('../models/user');
var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens
var config = require('../config.js');

exports.getToken = function (user) {
    return jwt.sign(user, config.secretKey, {
        expiresIn: 3600
    });
};

exports.verifyOrdinaryUser = function (req, res, next) {
    // check header or url parameters or post parameters for token
    var token = req.body.token || req.query.token || req.headers['x-access-token'];

    // decode token
    if (token) {
        // verifies secret and checks exp
        jwt.verify(token, config.secretKey, function (err, decoded) {
            if (err) {
                var err = new Error('You are not authenticated!');
                err.status = 401;
                return next(err);
            } else {
                // if everything is good, save to request for use in other routes
                req.decoded = decoded;
                next();
            }
        });
    } else {
        // if there is no token
        // return an error
        var err = new Error('No token provided!');
        err.status = 403;
        return next(err);
    }
};

希望这对你有帮助......

© www.soinside.com 2019 - 2024. All rights reserved.