MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Проста страница за вход в nodejs, използвайки експрес и паспорт с mongodb

Ето една проста настройка с помощта на паспорт за влизане/излизане на потребителите:

В основния файл app.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);

На вашия потребителски модел (напр. app/models/User.js)

Използвам модула passport-local, който допълнително опростява логиката за влизане: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;

В app/controllers/authController.js

Използвам приложение с една страница, така че връщам JSON при влизане/излизане. Ако искате да пренасочите към някъде другаде, ще трябва да промените функциите „успешно влизане“ и „неуспешно влизане“ (или да извикате res.render(...) или каквото и да било).

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;

И накрая, трябва да посочите формата си за вход (който трябва да има method="post" набор от атрибути) към /auth/login. При успешно влизане ще се изпълни обратното извикване "loginSuccess". При неуспешно влизане ще се изпълни обратното извикване "loginFailure".

Редактиране:

Можете да създадете нови потребители във вашата база данни mongo, като изпълните нещо като:

// 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 */'); 
    });
},
...

След това посочете формуляр за регистрация към /auth/register. Не проверих данните, но трябва да ги потвърдите, преди да опитате да запазите потребителя.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB find()

  2. Препращане към други документи по String, а не по ObjectId

  3. TransactionRequiredException Изпълнение на заявка за актуализиране/изтриване

  4. Как да използвате криптиране за защита на данните на MongoDB

  5. Условие на заявка за MongoDb при сравняване на 2 полета