Javascript 通过Passport Js注册用户

Javascript 通过Passport Js注册用户,javascript,node.js,express,authentication,passport.js,Javascript,Node.js,Express,Authentication,Passport.js,我想通过passport.js的帮助从注册页面添加新用户 报名表格如下 <form id="Signup-form" name="SignupForm" action="/signup" method="post"/> <input type="text" id="firstname" name="Firstname" > <input type="text" id="lastname" name="Lastname"/> <input type="em

我想通过passport.js的帮助从注册页面添加新用户 报名表格如下

<form id="Signup-form" name="SignupForm" action="/signup" method="post"/>
<input type="text" id="firstname" name="Firstname" >
<input type="text" id="lastname" name="Lastname"/>
<input type="email" name="email" />
<input type="text" id="rollno" name="rollno"/>
<input type="password" name="password" id="password"/>
<input type="password" name="confirm" id="confirm-password"/>
<input type="radio" name='Gender' value="Male" />
<input type="radio" name='Gender' value="FeMale" />
</form>
数据库设置后

require('./config/passport');
初始化为

app.use(passport.initialize());
app.use(passport.session());
注册后路线

router.post('/signup', passport.authenticate('local.signup' , {
successRedirect : '/home',
failuerRedirect : '/signup',
failuerFlash: true
}));
我的用户模型

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt-nodejs')

const UserSchema = new Schema({
First_Name : String,
Last_Name : String,
email : String,
Roll_No : String,
Gender : String,
password : String
},{collection : 'Users'});

UserSchema.methods.encryptPassword = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(5), null);
};

UserSchema.methods.validPassword = function(password) {
return bcrypt.compareSync(password, this.password);
}
var User = mongoose.model('User' , UserSchema); 
module.exports = User;
现在我的passport.js文件在config dir中

var passport = require('passport');
var User = require('../models/user');
var LocalStrategy = require('passport-local').Strategy;
passport.serializeUser(function (user, done) {
done(null, user.id);
});

passport.deserializeUser(function (id, done) {
User.findById(id, function (err, user) {
done(err, user);
 });
});
我的主要问题是如何在所有字段中为该路线编写策略

passport.use('local.signup', new LocalStrategy({
//strategy code here
}));
这是一个很好的例子


使用下面的链接使用passport进行登录注册

对于任何试图了解如何在passport local中添加用户名(可以是电子邮件)和密码以外的其他字段的人,接受的答案仅提示如何操作。假设您希望为您的用户模型使用名称、电子邮件和密码。您可以使用Passport local这样做:

const passport = require('passport');
const localStrategy = require('passport-local').Strategy;
const User = require('./model/user');

passport.use('signup', new localStrategy({
  usernameField : 'email',
  passwordField : 'password',
  passReqToCallback: true
}, async (req, email, password, done) => {
  try {
    const name = req.body.name;
    const user = await User.create({ name, email, password });
    return done(null, user);
  } catch (error) {
    done(error);
  }
}));

需要注意的是:passport localStrategy对象不接受usernameField和passwordField之外的其他字段。但是您可以将请求对象传递给回调。然后,在将用户保存到数据库之前,从req.body对象中提取字段并将其放入create方法中(如果您使用的是Mongoose.js)

PassportJ还具有实用功能。如果您不想使用中间件注册用户,可以使用常规post请求创建用户,然后使用passport js的登录功能对其进行身份验证(将新创建的用户对象添加到当前会话)

router.post('/auth/signup',(req,res,next)=>{
const user=新用户();
请求登录(用户,(错误)=>{
控制台日志(“成功”);
}

})
你能帮我解决这个问题吗?这是你的答案,你只需要更改5行代码。我给了你90%的分数,你只需要做10%。如果你不理解这个代码的作用(顺便说一句,这很简单),也许你应该读一下express中间件和passport的工作原理
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 back the entire request to the callback
    },
    function(req, email, password, done) {

        // find a user whose email is the same as the forms email
        // we are checking to see if the user trying to login already exists
        User.findOne({ 'local.email' :  email }, function(err, user) {
            // if there are any errors, return the error
            if (err)
                return done(err);

            // check to see if theres already a user with that email
            if (user) {
                return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
            } else {

                // if there is no user with that email
                // create the user
                var newUser            = new User();

                // set the user's local credentials
                newUser.local.email    = email;
                newUser.local.password = newUser.generateHash(password);

                // save the user
                newUser.save(function(err) {
                    if (err)
                        throw err;
                    return done(null, newUser);
                });
            }

    }));
const passport = require('passport');
const localStrategy = require('passport-local').Strategy;
const User = require('./model/user');

passport.use('signup', new localStrategy({
  usernameField : 'email',
  passwordField : 'password',
  passReqToCallback: true
}, async (req, email, password, done) => {
  try {
    const name = req.body.name;
    const user = await User.create({ name, email, password });
    return done(null, user);
  } catch (error) {
    done(error);
  }
}));