MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Trang đăng nhập đơn giản trong nodejs bằng express và passport với mongodb

Đây là một thiết lập đơn giản sử dụng hộ chiếu để đăng nhập / đăng xuất người dùng:

Trên tệp app.js chính

/* 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);

Trên mô hình người dùng của bạn (ej. app / models / User.js)

Tôi đang sử dụng mô-đun passport-local, mô-đun này đơn giản hóa hơn nữa logic đăng nhập: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;

Trên app / controllers / authController.js

Tôi đang sử dụng ứng dụng một trang, vì vậy tôi đang trả lại JSON khi đăng nhập / đăng xuất. Nếu bạn muốn chuyển hướng đến một nơi khác, bạn sẽ phải sửa đổi các chức năng "đăng nhập thành công" và "đăng nhập thất bại" (hoặc gọi res.render (...) hoặc bất cứ điều gì).

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;

Cuối cùng, bạn nên trỏ biểu mẫu đăng nhập của mình (cần phải có method="post" bộ thuộc tính) thành / auth / đăng nhập. Khi đăng nhập thành công, lệnh gọi lại "loginSuccess" sẽ được thực thi. Khi đăng nhập không thành công, lệnh gọi lại "loginFailure" sẽ được thực thi.

Chỉnh sửa:

Bạn có thể tạo người dùng mới trong cơ sở dữ liệu mongo của mình bằng cách thực thi một số thứ như:

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

Sau đó, trỏ một biểu mẫu đăng ký đến / auth / register. Tôi đã không xác thực dữ liệu, nhưng bạn nên xác thực nó trước khi cố gắng lưu người dùng.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $ atan

  2. Sử dụng trình tạo Active Record sau khi cài đặt Mongoid?

  3. Node js mongoose giới hạn cư trú

  4. Mongoose find (), làm thế nào để truy cập các tài liệu kết quả?

  5. Làm thế nào để sử dụng dấu chấm trong tên trường?