Passport: Allow sign up with name and email address? (Local Strategy)

后端 未结 6 2308
孤街浪徒
孤街浪徒 2020-12-31 01:15

Is there any way to allow a user to register on the local strategy with his password, email and name?
Every example I could find online only use name/password or email/p

6条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-31 01:50

    You can be a little confused but passport doesn't implement signup methods. It's just authorisation library. So you must handle that use-case on your own.

    First of all, create route that will be responsible for sign-up and your checks:

    signup: function (req, res) {
      User
        .findOne({
          or: [{username: req.param('username')}, {email: req.param('email')}]
        })
        .then(function(user) {
          if (user) return {message: 'User already exists'};          
          return User.create(req.allParams());
        })
        .then(res.ok)
        .catch(res.negotiate);
    }
    

    The example above is based on Sails framework, but you can fit it with no problems to your own case.

    Next step is include passport local strategy.

    var passport = require('passport');
    var LocalStrategy = require('passport-local').Strategy;
    
    var LOCAL_STRATEGY_CONFIG = {
      usernameField: 'email',
      passwordField: 'password',
      session: false,
      passReqToCallback: true
    };
    
    function _onLocalStrategyAuth(req, email, password, next) {
      User
        .findOne(or: [{email: email}, {username: email}])
        .then(function (user) {
          if (!user) return next(null, null, {
            code: 'E_USER_NOT_FOUND',
            message: email + ' is not found',
            status: 401
          });
    
          if (!HashService.bcrypt.compareSync(password, user.password)) return next(null, null, {
            code: 'E_WRONG_PASSWORD',
            message: 'Password is wrong',
            status: 401
          });
    
          return next(null, user, {});
        })
        .catch(next);
    }
    
    passport.use(new LocalStrategy(LOCAL_STRATEGY_CONFIG), _onLocalStrategyAuth));
    

    We have only signin task now. It's simple.

    signin: function(req, res) {
      passport.authenticate('local', function(error, user, info) {
        if (error || !user) return res.negotiate(Object.assign(error, info));
        return res.ok(user);
      })(req, res);
    }
    

    This way is more suitable for passport and works great for me.

提交回复
热议问题