passport.js挂在一些帖子上

时间:2017-06-24 17:33:29

标签: node.js express passport.js

我一直在搜索stackoverflow,原因是我的node.js(express)应用程序挂起了一些带有passport.js的帖子。

我一直在看两个问题:

More Passport.js woes - hangs on form submission

Passport (local) is hanging on Authentication

我创建用户的代码工作正常,如下所示:

passport.use('local-signup', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {
        if (email)
            email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching

        // asynchronous
        process.nextTick(function() {
            // if the user is not already logged in:
            if (!req.user) {

                User.findOne({
                    where: {
                        local_email: email
                    }
                }).then(function(user) {
                    if (user){
                        return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
                    }else{
                        // create the user
                        User
               .build({
                  local_email: email,
                              local_password: generateHash(password),
                              id: 1 //Normal activated user
               })
               .save()
               .then(newUser => {
                //Our newly crated user
                return done(null, newUser);
               })
               .catch(error =>{
               //Woops something went wrong 
               return done(error); 
               })

                        //var newUser            = new User();
                        //newUser.localemail    = email;
                        //newUser.localpassword = generateHash(password);

                        //User.create(newUser).then(function(newUser, created) {
                        //    if (!newUser) {
                        //        return done(err);
                        //    }
                        //    if (newUser) {
                        //        return done(null, newUser);
                        //    }
                        //});
                    }
                });
                // if the user is logged in but has no local account...
            } else if ( !req.user.local.email ) {
                // ...presumably they're trying to connect a local account
                // BUT let's check if the email used to connect a local account is being used by another user
                User.findOne({
                    where: {
                        localemail: email
                    }
                }).then(function(user) {
                    if (err)
                        return done(err);
                    if (user){
                        return done(null, false, req.flash('loginMessage', 'That email is already taken.'));
                        // Using 'loginMessage instead of signupMessage because it's used by /connect/local'
                    } else {
                        // create the user
                        var newUser            = new User();

                        newUser.local.email    = email;
                        newUser.local.password = generateHash(password);
                        User.create(newUser).then(function(newUser, created) {
                            if (!newUser) {
                                return done(err);
                            }
                            if (newUser) {
                                return done(null, newUser);
                            }
                        });
                    }
                });
            } else {
                // user is logged in and already has a local account. Ignore signup. (You should log out before trying to create a new account, user!)
                return done(null, req.user);
            }
        });
    }));

在我的路径文件中,该函数的帖子如下所示:

// process the signup form
app.post('/signup', passport.authenticate('local-signup', {
    successRedirect : '/profile', // redirect to the secure profile section
    failureRedirect : '/signup', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));

我的登录代码不是很好用。 passport.js中的函数如下所示:

passport.use('local-login', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {
        if (email)
            email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching

        // asynchronous
        process.nextTick(function() {
            User.findOne({
                where: {
                    local_email: email
                }
            }).then(function(user){
        console.log("TEST: "+user);
                // if no user is found, return the message
                if (!user){
        console.log("no user with the following email: " +email);
                    return done(null, false, req.flash('loginMessage', 'No user found.'));
                }else if(!validPassword(password,user.local_password)){
                    console.log("wrong password");
        return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));
                // all is well, return user
                 }else{
                    return done(null, user);
        return;
          }
            }).catch(function(err){
        console.log("woops der skete en fejl: "+err);
        console.log("email is: "+email);
                console.log("password is: "+password); 
        return done(err);   
    });

        });

    }));

相应的路线如下:

// process the login form
app.post('/login', passport.authenticate('local-login', {
    successRedirect : '/', // redirect to the secure profile section
    failureRedirect : '/login', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));

上面的代码在提交表单时挂起。如果我将代码更改为:

app.post('/login', function(req, res, next) {
    passport.authenticate('local-login', function(err, user, info) {
      if (err) { return next(err); }
      if (!user) {
        return res.render('/login', {
          pageTitle: 'Sign in',
          form: req.body
        });
      }
      req.logIn(user, function(err) {
        if (err) { return next(err); }
        return res.redirect('/');
      });
    })(req, res, next);
});

我收到了500。 任何想法为什么这不起作用?

更新了控制台输出:

Executing (default): SELECT `id`, `role`, `local_email`, `local_password`, `facebook_id`, `facebook_token`, `facebook_email`, `facebook_name`, `twitter_id`, `twitter_token`, `twitter_displayname`, `twitter_username`, `google_id`, `google_token`, `google_email`, `google_name`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`local_email` = 'test@local' LIMIT 1;
TEST: [object SequelizeInstance:users]
POST /login 302 87.021 ms - 46
Executing (default): SELECT `id`, `role`, `local_email`, `local_password`, `facebook_id`, `facebook_token`, `facebook_email`, `facebook_name`, `twitter_id`, `twitter_token`, `twitter_displayname`, `twitter_username`, `google_id`, `google_token`, `google_email`, `google_name`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`id` = 1;

更新了passport.deserializeUser

 passport.deserializeUser(function(id, done) {
        /*User.findById(id, function(err, user) {
            done(err, user);
        });*/
        User.findById(id).then(user => {
            if (!user){
                done(null);
            }else{
                done(user);
            }
        })
    });

1 个答案:

答案 0 :(得分:0)

您的passport.deserializeUser不正确。与所有Node.js回调一样,第一个参数是为错误保留的,如果没有任何错误,则应该是null(或另一个假值)。在您的情况下,您将user作为第一个参数传递,这使Passport认为存在错误。

试试这个:

passport.deserializeUser(function(id, done) {
  User.findById(id)
      .then(user => done(null, user))
      .catch(done);
});