v0.0.7 Authentication - zhentian-wan/MEANAppsFiles GitHub Wiki

We use passport for Authentication.

Install:

 npm install passport passport-local --save

passport-local can deal with facebook, google, twitter auth stuff.


Create User schema

config/mongoose.js

    //Users data
    var userSchema = mongoose.Schema({
        firstName: String,
        lastName: String,
        username: String
    });
    var User = mongoose.model('User', userSchema);

Currently, we just use username to login user, later will add password also.

Testing data

    User.find({}).exec(function(err, collection){
        if(_.size(collection) === 0){
            User.create({firstName: 'John', lastName: 'Linquist', username: 'John'});
            User.create({firstName: 'Ken', lastName: 'CD', username: 'Ken'});
            User.create({firstName: 'Ben', lastName: 'Cophen', username: 'Ben'});
        }
    })

User.find({}) search for users in database, then we check the results, if it is empty, then we create some test data.

config/auth.js

var passport = require('passport');

exports.auth = function(req, res, next){
    var auth = passport.authenticate('local', function(err, user){

        // if error, pass error info to next middleware
        if(err){
            return next(err);
        }

        // if user not exists, send back login faild
        if(!user){
            res.send({success: false});
        }

        // if everything is ok, send back success message and user info
        req.logIn(user, function(err){
            if(err) {return next(err);}
            res.send({success: true, user: user});
        })
    });

    auth(req, res, next);
};

config/route.js

var auth = require('./auth');
app.post('/login', auth.auth);

config/express.js We need to add cookieParser, session, passport to the express.js

    //cookieParser
    app.use(cookieParser());

    //bodyparser
    app.use(bodyParser.urlencoded({extended: true}));
    app.use(bodyParser.json());
    app.use(session({secret: 'multi vision unicorns', resave:false, saveUninitialized:false}));
    app.use(passport.initialize());
    app.use(passport.session());

server.js

var User = mongoose.model('User');
passport.use(new LocalStrategy(
    function(username, password, done){
        User.findOne({username: username}).exec(function(err, user){

            if(user){
                return done(null, user);
            }else{
                return done(null, false);
            }
        });
    }
));

passport.serializeUser(function(user, done){
    if(user){
        done(null, user._id);
    }
});

passport.deserializeUser(function(id, done){
    User.findById(id, function(err, user){
        if(user){
            return done(null, user);
        }else{
            return done(null, false);
        }
    })
});