Page de connexion Simple en nodejs en utilisant express et passport avec mongodb

j'ai créé un simple formulaire de connexion en utilisant Jade Et Express at / login les données du formulaire sont envoyées via POST to /login

au début, il s'agissait simplement d'une correspondance basée sur une chaîne de caractères (si nom d'utilisateur== && mot de passe== ) puis rediriger vers /home ou rediriger vers /login

Simple.

maintenant je veux que le pilote de base de données, le nom d'utilisateur et le mot de passe soient stockés sur une base de données mongodb, correspondent le mot de passe du nom d'utilisateur de db et faire les procédures.

je souhaite utiliser passportJS pour cela, mais je suis totalement frappé, de la création de base de données à la configuration de passeport.

est-ce que quelqu'un peut m'aider à faire une page de connexion simple basée sur une base de données ? Je suis nouveau dans les trucs de nodejs. Toute aide serait sérieusement appréciée

10
demandé sur laggingreflex 2013-09-26 13:48:15

1 réponses

Voici une configuration simple utilisant passport pour se connecter / déconnecter les utilisateurs:

Sur l'application principale.fichier js

/* Auth config  --------------------------------*/
// @see http://frederiknakstad.com/authentication-in-single-page-applications-with-angular-js/

var passport = require('passport');
var User = require('./app/models/User'),

passport.use(User.localStrategy);
passport.serializeUser(User.serializeUser);
passport.deserializeUser(User.deserializeUser);

// Default session handling. Won't explain it as there are a lot of resources out there
app.use(express.session({
    secret: "mylittlesecret",
    cookie: {maxAge: new Date(Date.now() + 3600000)}, // 1 hour
    maxAge: new Date(Date.now() + 3600000), // 1 hour
    store: new RedisStore(config.database.redis), // You can not use Redis 
}));

// The important part. Must go AFTER the express session is initialized
app.use(passport.initialize());
app.use(passport.session());

// Set up your express routes
var auth = require('./app/controllers/authController.js');

app.post('/auth/login', auth.login);
app.post('/auth/logout', auth.logout);
app.get('/auth/login/success', auth.loginSuccess);
app.get('/auth/login/failure', auth.loginFailure);

sur votre modèle utilisateur (ej. app / models / User.js)

j'utilise le module passport-local, ce qui simplifie encore plus la logique de connexion: https://github.com/jaredhanson/passport-local

/* Your normal user model      ----------------------*/
var mongoose = require('mongoose'),
    ObjectId = mongoose.Schema.Types.ObjectId,
    PassportLocalStrategy = require('passport-local').Strategy;

var schema = new mongoose.Schema({
    name: {type:String, required:true, trim:true},
    email: {type:String, required: true, trim: true, lowercase:true, unique: true},
    image: {type:String},
    password: {type:String, required: true },
    created: {type: Date, default: Date.now}
});

/* Auth properties      ---------------------------*/
/* (passport)           ---------------------------*/

// This is your main login logic
schema.statics.localStrategy = new PassportLocalStrategy({
        usernameField: 'email',
        passwordField: 'password',
    },

    // @see https://github.com/jaredhanson/passport-local
    function (username, password, done){
        var User = require('./User');
        User.findOne({email: username}, function(err, user){
            if (err) { return done(err); }

            if (!user){
                return done(null, false, { message: 'User not found.'} );
            }
            if (!user.validPassword(password)){
                return done(null, false, { message: 'Incorrect password.'} );
            }

            // I'm specifying the fields that I want to save into the user's session
            // *I don't want to save the password in the session
            return done(null, {
                id: user._id,
                name: user.name,
                image: user.image,
                email: user.email,
            });
        });
    }
);

schema.methods.validPassword = function(password){
    if (this.password == password){
        return true;
    }

    return false;
}

schema.statics.serializeUser = function(user, done){
    done(null, user);
};

schema.statics.deserializeUser = function(obj, done){
    done(null, obj);
};

var model = mongoose.model('User', schema);

exports = module.exports = model;

sur app/controllers/authController.js

j'utilise une application d'une page, donc je renvoie JSON sur login / logout. Si vous souhaitez rediriger vers un autre endroit, vous devrez modifier les fonctions "login success" et "login failure" (ou appeler res.render(...) ou peu importe).

var passport = require('passport');
var AuthController = {

    // Login a user 
    login: passport.authenticate('local', {
        successRedirect: '/auth/login/success',
        failureRedirect: '/auth/login/failure'
    }),

    // on Login Success callback
    loginSuccess: function(req, res){
        res.json({
            success: true,
            user: req.session.passport.user
        });
    },

    // on Login Failure callback
    loginFailure: function(req, res){
        res.json({
            success:false, 
            message: 'Invalid username or password.'
        });
    },

    // Log out a user   
    logout: function(req, res){
        req.logout();
        res.end();
    },

};

exports = module.exports = AuthController;

enfin, vous devez pointer votre formulaire de connexion (qui doit avoir l'attribut method="post" ) vers /auth/login. Lors de la réussite de la connexion, le callback "loginSuccess" sera exécuté. Sur d'échec de la connexion, l' la fonction de rappel" loginFailure " sera exécutée.

Edit:

vous pouvez créer de nouveaux utilisateurs dans votre base de données mongo en exécutant quelque chose comme:

// On your main app.js file
app.post('/auth/register', auth.register);

// On your authController.js file, as per the previous example
var User = require('./app/models/User'); // The model we defined in the previous example    

...
register: function(req, res){
    User.create({name: req.body.name, email: req.body.email, password: req.body.password}, function(err){
      if (err) {
        console.log(err);
        ... // Your register error logic here
        res.redirect('/* Your error redirection path */');
        return;
      }

      res.redirect('/* Your success redirection path */'); 
    });
},
...

ensuite, pointer un formulaire d'enregistrement vers /auth/register. Je n'ai pas validé les données, mais vous devez le valider avant d'essayer d'économiser de l'utilisateur.

27
répondu David Oliveros 2013-09-26 13:52:31