ここでは、解決策はmongooseベースのodmに基づいています。最初の部分はパスポート関連の部分です。また、odmからパスワードの暗号化方法についても説明しました。
私はあなたの質問を理解した場合、あなたは自分の電子メールまたはパスワードを入力する必要があります。この場合、検索を修正して、両方とも試してみてください。つまり、findOne(...)への呼び出しで指定されたユーザーIDとユーザー名またはパスワードを一致させてください。
私はbcryptを使用して、そのため、パスワードをテストするためのカスタマイズされた比較方法があります。また、Google認証を使用する際のヒントもご存知でしょう。システムが両方とも有効になっていれば、必要なコードを追加して必要なコードを追加してください。
------------認証部(単に関連スニペット)-----------
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');
}
});
});
---ユーザ/ 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);
});
};
なぜdownvote? – Forivin
あなたはおそらく独自の戦略を構築する必要がありますが、このような既に構築された戦略を簡単に見つけることができます。https:// githubcom/zkochan/passport-email – mfreitas
パスワードは古くなっていますが、基本的には、サイトのインターネット上で100番目のパスワードを覚えておいてください。そして、2回目にサイトを訪れたときにはパスワードを忘れてしまいます。 authミドルウェアは、同じ戦略の電子メール/パスワードまたは名前/パスワードを使用して、ログイン/エラーログイン/パスワードapiを忘れるために、より膨れたコードを作成します。 FB/Google認証APIを使用するか、https://github.com/florianheinemann/passwordless – syarul