Authenticate user using mongoose + express.js

What is the best way to authenticate a user using Mongoose and ExpreeJS.

I am using mongoose 3.x, and it looks like this package is no longer being updated: https://github.com/bnoguchi/mongoose-auth

Ideally, I could authenticate the user using twitter and facebook.

+2
source share
3 answers

I always prefer not to use a plugin or module for every problem. Using only the mongoose, you can do it like this:

You have db.js to configure your mongoDB

var mongoose = require('mongoose');
mongoose.connect("mongodb://...");
var userSchema = new mongoose.Schema({
  username: String,
  salt: String,
  hash: String
});
exports.User = mongoose.model("user", userSchema);

Use the TJ pass.js file for hash passwords. It uses crypto.pbkdf2 for encryption.

:

var db = require('./db');
var pwd = require('./pwd');
var user = new db.User();
user.username = "Admin";
pwd.hash("adminPassword", function(err, salt, hash) {
  if (err) {
    console.log(err);
  }
  user.salt = salt;
  user.hash = hash;
  user.save(function(err) {
    if (err) {
      console.log(err);
    } else {
      console.log("user saved");
    }
  });
});

, db. :

function authenticate(name, pass, fn) {
  db.User.findOne ({username: name}, function(err, user) {
    if (!user) return fn(new Error('cannot find user'));
    hash(pass, user.salt, function(err, hash){
      if (err) return fn(err);
      if (hash == user.hash) return fn(null, user);
      fn(new Error('invalid password'));
    })
  })
}

app.post('/login', function(req, res){
  authenticate(req.body.username, req.body.password, function(err, user){
    if (user) {
      req.session.regenerate(function(){
        req.session.user = user;
        res.redirect('back');
      });
    } else {
      res.redirect('login');
    }
  });
});

// middleware
function restrict(req, res, next) {
  if (req.session.user) {
    next();
  } else {
    req.session.error = 'Access denied!';
    res.redirect('/login');
  }
}

// route with restrict middleware
app.get('/restricted', restrict, function(req, res){
  res.send('Wahoo! restricted area');
});

auth, . , !

+10

, , MongoDB Node:

https://github.com/braitsch/node-login

, . bcrypt . AccountManager, , Mongo.

, , Passport.js. , , . , .

+3

Everyauth - , , twitter facebook.

See this post from the author in another SO question for a good overview of its features and benefits.

0
source

All Articles