2016-01-29 6 views
2

Я строю регистрацию пользователя с помощью nodejs и express. Я создаю нового пользователя без паспорта или любой стратегии аутентификации. я хочу, чтобы пользователь был обработан как зарегистрированный, как только он зарегистрировался успешно. Так что я создаю login api для пользователя. Если пользователь может аутентифицироваться, используя только поле электронной почты (поскольку я не сохраняю пароль с пользователем). Но я не могу проверять пользователя, поскольку получаю «отсутствующие учетные данные» в удостоверении подлинности паспорта.аутентификация в паспорте без пароля.

app.js

var config = require('./config/development'); 
var passport = require('passport'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var session  = require('express-session'); 

var app = express(); 

//connect db 
mongoose.connect(config.db); 
mongoose.set('debug', config.mongoose.debug); 

require('./config/passport')(passport); // pass passport for configuration 

//initialize all models 
var modelsPath = require('path').join(__dirname, 'models'); 
require('fs').readdirSync(modelsPath).forEach(function(file) { 
    require('./models/' + file); 
}); 


// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 


app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(expressValidator()); 

app.use(bodyParser.urlencoded({ 
    extended: false 
})); 
app.use(cookieParser()); 

/// required for passport 
app.use(session({ 
secret: 'anystringoftext', 
saveUninitialized: true, 
resave: true 
})); // session secret 
app.use(passport.initialize()); 
app.use(passport.session()); // persistent login sessions 

app.use(express.static(path.join(__dirname, 'public'))); 


require('./routes')(app, passport); 

passport.js

var mongoose = require('mongoose'), 
    LocalStrategy = require('passport-local').Strategy, 
    User = require('../models/users'); 

module.exports = function(passport) { 
    // Serialize the user id to push into the session 
    passport.serializeUser(function(user, done) { 
    done(null, user.id); 
    }); 

    // Deserialize the user object based on a pre-serialized token 
    // which is the user id 
    passport.deserializeUser(function(id, done) { 
    User.findOne({ 
     _id: id 
    }, function(err, user) { 
     done(err, user); 
    }); 
    }); 

    // Use local strategy 
    passport.use(new LocalStrategy({ 
     usernameField: 'email', 
     passReqToCallback : true 
    }, 
    function(email, password, done) { 
    User.findOne({ 
     email: email 
    }, function(err, user) { 
     if (err) { 
     return done(err); 
     } else { 
     return done(null, user); 
     } 
    }); 
    } 
)); 

    return passport; 
}; 

маршруты/user.js

module.exports = function(app, passport) { 
app.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (user === false) { 
     res.json('no user found'); 
    } else { 
     res.json('login successful'); 
    } 
    })(req, res, next); 
}); 
}; 

ли кто-нибудь, пожалуйста, помогите мне понять, что я делаю неправильно здесь ,

ответ

0

В вашем случае вы не можете использовать LocalStrategy. Но вы можете реализовать свою собственную стратегию, используя узловой модуль passport-strategy подробнее: https://www.npmjs.com/package/passport-strategy

+0

Благодарим вас за ответ. Я попробую. – zulekha

6

Вы на полпути. You может использовать паспорт-локальный, и для этого требуется только имя пользователя.

Вы можете переопределить имя пользователя и пароль, чтобы использовать тот же ключ.

passport.use(new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'email', 
    passReqToCallback : true 
}, 

Для этого требуется только одно поле в запросе на вход.

+0

Ничего себе просто. Большое вам спасибо за это. –

Смежные вопросы