sql >> データベース >  >> NoSQL >> MongoDB

mongodbでエクスプレスとパスポートを使用したnodejsのシンプルなログインページ

    パスポートを使用してユーザーにログイン/ログアウトする簡単なセットアップは次のとおりです。

    メインの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);
    

    ユーザーモデル(ej。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. MongoDB保存データの暗号化

    3. Spring Bootアプリケーションでの統合テスト用にEmbeddedMongDBをどのように構成しますか?

    4. mongodbで重複するURLを検索する