护照:允许注册姓名和电子邮件地址? (地方战略)

有没有办法允许用户使用他的密码,电子邮件和名字在本地策略上注册?
我在网上find的每个例子只使用名字/密码或电子邮件/密码。

我也搜查了整个护照文件,但是这些文件根本没有帮助。 这只是一个充满实例的臃肿网站。
我只需要一个函数,类和variables护照使用清单,并解释他们和他们的每个参数。 每个好的图书馆都有类似的东西,为什么我找不到护照?

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

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

那么护照真的有限吗? 必须有办法做到这一点,对吗?

您可能会有点困惑,但护照不执行注册方法。 这只是授权库。 所以你必须自己处理这个用例。

首先,创build将负责注册和检查的路线:

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

我们现在只有login任务。 这很简单。

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

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

这里是为我工作的,解决scheme是基于一个基于mongoose的odm,第一部分是护照相关部分,我也附加了odm的用户部分,以及如何对密码进行encryption。

如果我理解你的问题,你希望用户input他的电子邮件或密码。 在这种情况下,修改search以尝试两个,也就是说,匹配提供的用户标识符(在您的调用findOne(…)与用户名或密码。

请注意,我使用bcrypt来避免存储明确的密码,这就是为什么有一个自定义的比较方法来testing密码。 还要注意使用谷歌身份validation的“提示”,我的系统启用了两个,如果是相关的,请lemme知道,我可以添加所需的代码。

———— Auth部分(只是相关的片段)———–

 var passport = require('passport'), LocalStrategy = require('passport-local').Strategy; passport.serializeUser(function(user, done) { // the values returned here will be used to deserializeUser // this can be use for further logins done(null, {username: user.username, _id: user.id, role: user.role}); }); passport.deserializeUser(function(user, done) { done(null, user); }); passport.use(new LocalStrategy(function(username, password, done){ odm.User.findOne({username: username, authType: 'direct'}, function(err, user){ if(err){ return done(err, false); } if(!user){ return done(null, false); } if(user.role === 'new'){ console.log('can not use new user!'); return done('user not activated yet, please contact admin', false); } user.comparePassword(password,function(err, isMatch){ if(err){ return done(err, false); } if(isMatch){ return done(null, user);//{username: username}); } return done(null, false); }); }); })); app.post('/login', function(req, res, next){ passport.authenticate('local', { failureRedirect: '/logout?status=login failed' }, function(err, user, info){ if(err){ return next(err); } if(!user){ return res.redirect('/login'); } req.logIn(user, function(err){ if (req.body.rememberme) { req.session.cookie.maxAge = 30*24*60*60*1000 ;//Rememeber 'me' for 30 days } else { req.session.cookie.expires = false; } var redirect = req.param('redirect') || '/index'; res.redirect(redirect); }); } )(req, res, next); } ); app.post('/register',function(req, res){ var user = new odm.User({username: req.body.username, password: req.body.password, email: req.body.email, authType: 'direct'}); user.save(function(err, user){ if(err){ console.log('registration err: ' , err); } else { res.redirect('/list'); } }); }); 

— user / odm,相关部分—————-

 var bcrypt = require('bcrypt-nodejs'); // --------------------- User ------------------------------------------ // var userSchema = new Schema({ name: String, email: String, username: {type: String, required: true, unique: true}, password: String, role: {type: String, required: true, enum: ['new', 'admin', 'user'], default: 'new'}, authType: {type: String, enum: ['google', 'direct'], required: true} }); userSchema.pre('save', function (next) { var user = this; if (!user.isModified('password')) return next(); console.log('making hash...........'); bcrypt.genSalt(SALT_WORK_FACTOR, function (err, salt) { if (err) return next(err); bcrypt.hash(user.password, salt, null, function (err, hash) { if (err) return next(err); user.password = hash; next(); }); }); }); userSchema.methods.comparePassword = function (candidatePassword, cb) { bcrypt.compare(candidatePassword, this.password, function (err, isMatch) { if (err) return cb(err); cb(null, isMatch); }); }; 
 var localStrategy = require('passport-local').Strategy; var User = require('../public/models/user'); module.exports = function(passport){ 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({ usernameField: 'email', passwordField: 'password', passReqToCallback: true }, function(req, email, password, done){ process.nextTick(function(){ User.findOne({'local.enroll': email}, function(err, user){ if(err) return done(err); if(user){ return done(null, false, req.flash('signupmessage', 'The email already taken')); } else{ var newUser = new User(); newUser.local.enroll = email; newUser.local.password = newUser.generateHash(password); newUser.save(function(err){ if(err) throw err return done(null, newUser); }); } }); }); })); passport.use('local-login', new localStrategy({ usernameField: 'email', passwordField: 'password', passReqToCallback: true }, function(req, email, password, done){ process.nextTick(function(){ User.findOne({'local.enroll': email}, function(err, user){ if(err) return done(err); if(!user){ return done(null, false, req.flash('loginmessage', 'No user found')); } if(!user.validPassword(password)){ return done(null, false, req.flash('loginmessage', 'Invalid password')); } return done(null, user); }); }); })); } 
 UserModel.find({email: req.body.email}, function(err, user){ if(err){ res.redirect('/your sign up page'); } else { if(user.length > 0){ res.redirect('/again your sign up page'); } else{ //YOUR REGISTRATION CODES HERE } } })