2015-09-04 145 views
10

是否有任何方法允許用戶使用他的密碼,電子郵件和姓名在本地策略上註冊?
我在網上找到的每個例子只使用名稱/密碼或電子郵件/密碼。護照:允許註冊姓名和電子郵件地址? (本地策略)

我還搜遍了整個護照文件,但該文件根本沒有幫助。這只是一個充滿實例的臃腫網站。
我只需要一個函數,類和變量護照使用清單,並解釋它們和它們的每個參數。每個好的圖書館都有類似的東西,爲什麼我找不到護照?

這裏是我的代碼的關鍵部分:

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:// github。com/zkochan/passport-email – mfreitas

+0

密碼已過時,您基本上要求用戶在您的網站上記住互聯網上的第100個密碼,並且他們在第二次訪問您的網站時忘記了密碼,關於passportjs或任何快遞auth中間件使用非常相同的策略電子郵件/密碼或名稱/密碼,您將編寫更多臃腫的代碼來處理登錄/ err登錄/忘記密碼api。無論是使用FB /谷歌auth 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

下面是我工作的,解決方案是基於一個基於貓鼬的odm,第一部分是護照相關部分,我也附加了odm的用戶部分,以及如何對密碼進行加密。

如果我理解你的問題,你希望用戶輸入他的電子郵件或密碼。在這種情況下,修改搜索以嘗試兩種方式,即匹配提供的用戶標識符(在您撥打findOne(...)時用用戶名或密碼。

請注意,我使用bcrypt來避免存儲明確的密碼,這就是爲什麼有一個用於測試密碼的自定義比較方法,還要注意使用谷歌身份驗證的'提示',我的系統啓用了兩個,如果有關的話,請讓我知道,我可以添加所需的代碼

------------驗證部(只是相關片段)-----------

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                  
     }                   
    }                   
}) 
相關問題