有什么方法可以允许用户使用他的密码,电子邮件和姓名在本地策略上注册?
我在网上可以找到的每个示例仅使用名称/密码或电子邮件/密码。

我还搜索了整个护照文档,但是这些文档根本没有帮助。这只是一个examples肿的网站,上面有很多示例。
我只需要护照使用的函数,类和变量的列表,并说明它们以及它们的每个参数的作用。每个好的图书馆都有这样的东西,为什么我找不到护照呢?

这是我的代码的关键部分:

passport.use('local-signup', new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password',
    //are there other options?
    //emailField did not seem to do anything
    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) {
    //check if email not already in database
        //create new user using "email" and "password"
        //I want an additional parameter here "name"
}));

那么护照真的有那么有限吗?必须有一种方法可以做到,对吗?

最佳答案

您可能会有些困惑,但是护照没有实现注册方法。这只是授权库。因此,您必须自行处理该用例。

首先,创建将负责注册和检查的路由:

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

上面的示例基于Sails框架,但您可以根据自己的情况毫无问题地对其进行调整。

下一步是包括护照本地化策略。
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));

现在我们只有登录任务。这很简单。
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);
}

这种方式更适合护照,对我很有用。

关于javascript - Passport : Allow sign up with name and email address?(本地策略),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32398120/

10-16 21:26