24

nodejs でパスポートをセットアップし、ユーザーがログインして新しいアカウントを作成できるようにするために、mongoose と連携させます。

app.js:

var express = require('express')
  , app = module.exports = express.createServer()
  , passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy
  , routes = require('./routes/index')(app) //index loads in multiple routes
  , MongoDBConnection = require('./database/DatabaseConnector').MongoDBConnection;

// Configuration
app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.cookieParser());
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.session({ secret: 'justdoit' }));
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

var mongoDbConnection = new MongoDBConnection();

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

passport.deserializeUser(function(id, done) {
    mongoDbConnection.findUserById(id, function(err, user){
       done(err, user);
    });
});

passport.use(new LocalStrategy(
    function(username, password, done) {
        process.nextTick(function () {
            mongoDbConnection.findUser(username, function(err, user) {
                //conditions....
            });
        });
    }
));

app.get('/', function(req, res){
    res.render('index', { title: "Index", user: req.user });
});

app.get('/account', ensureAuthenticated, function(req, res){
    res.render('account', { title: "Account", user: req.user });
});

app.get('/login', function(req, res){
    res.render('login', { title: "Login", user: req.user, message: req.flash('error') });
});

app.post('/login',
    passport.authenticate('local', {
        successRedirect: '/account',
        failureRedirect: '/login',
        failureFlash: true })
);

function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) { return next(); }
    res.redirect('/login')
}

私の問題は、app.js (パスポート コードがある場所) ファイルが少し大きくなっていることです。パスポート セクションを独自のスクリプトに移動し、app.js の外部と独自の auth.js にルートを設定しようとしました。 route ファイルを作成し、app.js を介してルートを参照します。他のルートでは機能しますが、ログインなどのパスポート関連のルートでは、passport.authenicate() 関数を起動していないようです。

とにかく、パスポートのルートと関数を独自のファイルに入れて、それを呼び出したり、app.js からロードしたりできますか?

auth.js:

module.exports = function(app){

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

passport.deserializeUser(function(id, done) {
    mongoDbConnection.findUserById(id, function(err, user){
        done(err, user);
    });

});

passport.use(new LocalStrategy(
    function(username, password, done) {
        process.nextTick(function () {

            mongoDbConnection.findUser(username, function(err, user) {

                if (err) {
                    return done(err);
                }
                if (!user) {
                    return done(null, false, { message: 'Unknown user ' + username });
                }

                if (user.password != password) {
                    return done(null, false, { message: 'Invalid password' });
                }

                return done(null, user);
            });
        });
    }
));

app.get('/', function(req, res){
    res.render('index', { title: "Index", user: req.user });
});

app.get('/account', ensureAuthenticated, function(req, res){
    console.log("directing to the account page....");
    res.render('account', { title: "Account", user: req.user });
});

app.get('/login', function(req, res){
    res.render('login', { title: "Login", user: req.user, message: req.flash('error') });
});

app.post('/login',
    passport.authenticate('local', {
        successRedirect: '/account',
        failureRedirect: '/login',
        failureFlash: true })
);

function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) { return next(); }
    res.redirect('/login')
}
}
4

5 に答える 5

39

これが私がすることです。コードに合わせてさらにヘルプが必要な場合は、コメントしてください。

最初の一歩

パスポートコードを別のファイルに入れます。例: pass.js。(すでにそれを行っているようです) 次に、そのファイルで、すべてのコードを次の中に入れます。

module.exports = function(passport, LocalStrategy){

};

使用している他のものを関数入力に追加することを忘れないでください。あなたの場合、パスポートと LocalStrategy に加えて、入力として mongoDbConnection も追加する必要があるでしょう。

第二段階

app.js に次の行を含めます。可能であれば「app.listen」の直前で、すべてが適切に定義/宣言/インクルードされていることを確認します。

require('./pass.js')(passport, LocalStrategy);

説明

ステップ 1 の「ラッパー」は、アプリに含めるコードのチャンクを定義します。ステップ 2 の「require」は、実際にインクルードするコードです。基本的に、「pass.js」ファイル全体を関数として定義し、コードを実行するために必要なツール (パスポート、LocalStrategy など) を渡します。

あなたの場合、おそらく私のコードを次のように変更する必要があります。

module.exports = function(passport, LocalStrategy, mongoDbConnection){

};

require('./pass.js')(passport, LocalStrategy, mongoDbConnection);

これはうまくいくはずです。少し前にこれについてグーグルで検索しましたが、これはapp.jsを分割する「正しい」方法のようです(ただし、これは非常に恐れて言います:))。さらにヘルプが必要な場合は、お気軽にコメントしてください。

于 2012-09-22T20:23:06.127 に答える
6

この github リポジトリにも、この良い例があります。

https://github.com/madhums/nodejs-express-mongoose-demo

server.js ファイルは app.js になります。/config/passport.js は含まれているパスポートのセットアップです。

于 2013-05-13T21:08:36.603 に答える
4

このために、app.jsでこれを行うことをお勧めします

 require('./mypassport')(app);

そして mypassport.js

var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy

, MongoDBConnection = require('./database/DatabaseConnector').MongoDBConnection;

  module.exports = function(app){

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

  passport.deserializeUser(function(id, done) {
   mongoDbConnection.findUserById(id, function(err, user){
    done(err, user);
  });

});

passport.use(new LocalStrategy(
function(username, password, done) {
    process.nextTick(function () {

        mongoDbConnection.findUser(username, function(err, user) {

            if (err) {
                return done(err);
            }
            if (!user) {
                return done(null, false, { message: 'Unknown user ' + username });
            }

            if (user.password != password) {
                return done(null, false, { message: 'Invalid password' });
            }

              return done(null, user);
        });
      });
} 
));
}
于 2015-07-12T11:11:28.637 に答える
0
module.exports = function(app){

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

パスポートオブジェクトへの参照がないため、機能しない可能性がありますか?

于 2016-11-04T10:36:18.010 に答える