2015-09-04 10 views
10

ユーザーが自分のパスワード、電子メール、および名前でローカル戦略に登録する方法はありますか?
オンラインで見つかるすべての例では、名前/パスワードまたは電子メール/パスワードのみを使用しています。パスポート:名前とEメールアドレスでサインアップできますか? (ローカル戦略)

また、パスポートのドキュメント全体を検索しましたが、そのドキュメントは役に立たないものです。例がいっぱいの膨大なサイトです。
私は関数とクラスと変数のリストを必要としています。すべての良い図書館にはそういうものがありますが、どうしてパスポートで見つけられないのですか?ここで

は、私のコードの重要な部分です:

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

ので、パスポートは本当に限られていますか?これを行う方法がなければなりません、そうですか?

+1

なぜdownvote? – Forivin

+1

あなたはおそらく独自の戦略を構築する必要がありますが、このような既に構築された戦略を簡単に見つけることができます。https:// githubcom/zkochan/passport-email – mfreitas

+0

パスワードは古くなっていますが、基本的には、サイトのインターネット上で100番目のパスワードを覚えておいてください。そして、2回目にサイトを訪れたときにはパスワードを忘れてしまいます。 authミドルウェアは、同じ戦略の電子メール/パスワードまたは名前/パスワードを使用して、ログイン/エラーログイン/パスワードapiを忘れるために、より膨れたコードを作成します。 FB/Google認証APIを使用するか、https://github.com/florianheinemann/passwordless – syarul

答えて

14

少し混乱することがありますが、パスポートは申し込み方法を実装していません。それは単に認証ライブラリです。したがって、あなたは自分でユースケースを処理する必要があります。

まず、サインアップし、あなたの小切手を担当するルートを作成します。

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

上記の例では、帆のフレームワークに基づいておりますが、あなた自身のケースに問題なく、それに合うことができます。

次のステップには、パスポートのローカル戦略が含まれます。

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

この方法は、パスポートに適していて、私にはうってつけです。

3

ここでは、解決策は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); 
    }); 
}; 
1
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); 
      }); 
     }); 
    }));  
} 
0
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                  
     }                   
    }                   
}) 
関連する問題