简体   繁体   English

在注册护照-本地注册例程中出错

[英]Error in sign up passport-local sign up routine

I'm building an app in Node, using Passport and local signup and sign in strategies. 我正在使用Passport和本地注册以及登录策略在Node中构建应用程序。 I just keep running into an issue. 我只是一直遇到一个问题。 All the required modules etc. are there. 所有必需的模块等都在那里。 The following sign in routine works fine: 以下登录例程正常工作:

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);
    });

}));

However, the following sign up routine does not: 但是,以下注册例程不起作用:

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'));
            }
        });
    });
}))

Both routines are called within routes.js: 这两个例程都在route.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
}));

Any ideas where it might go wrong? 有什么想法可能会出错吗? As is, posting to /signup continuously results in a failureRedirect. 照原样,连续发布到/ signup会导致failureRedirect。 My head is getting kinda sore from banging on the screen... 我的头因撞在屏幕上而有点发痛。

The only thing you need to change is: 您唯一需要更改的是:

if (!user.validPassword(password))

To

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

I know, if (!user.validPassword(password)) is in examples on Passport.js official docs, but it is wrong. 我知道Passport.js官方文档中的示例中是否包含(!user.validPassword(password)),但这是错误的。

I have just lost 2 hours of my life, figuring this out. 我刚刚度过了两个小时的生命,弄清楚了这一点。

Use this code it will helps you to fix your problem 使用此代码将帮助您解决问题

passport-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 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);
    }
};

hope this helps for you... 希望这对您有帮助...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM