passport.session() ミドルウェアは何をしますか? 質問する

passport.session() ミドルウェアは何をしますか? 質問する

私はPassport.jsを使って認証システムを構築しています。簡単なノード認証: セットアップとローカルチュートリアル

何が原因なのか混乱していますpassport.session()

さまざまなミドルウェアを試してみた結果、 がexpress.session()セッション ID を Cookie 経由でクライアントに送信するものであることは理解できましたが、 が何passport.session()を実行するのか、また に加えてなぜそれが必要なのかについては混乱していますexpress.session()

アプリケーションの設定方法は次のとおりです。

// Server.js はアプリケーションを構成し、Web サーバーをセットアップします

//importing our modules
var express = require('express');
var app = express();
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');

var configDB = require('./config/database.js');

//Configuration of Databse and App

mongoose.connect(configDB.url); //connect to our database

require('./config/passport')(passport); //pass passport for configuration

app.configure(function() {

    //set up our express application

    app.use(express.logger('dev')); //log every request to the console
    app.use(express.cookieParser()); //read cookies (needed for auth)
    app.use(express.bodyParser()); //get info from html forms

    app.set('view engine', 'ejs'); //set up ejs for templating

    //configuration for passport
    app.use(express.session({ secret: 'olhosvermelhoseasenhaclassica', maxAge:null })); //session secret
    app.use(passport.initialize());
    app.use(passport.session()); //persistent login session
    app.use(flash()); //use connect-flash for flash messages stored in session

});

//Set up routes
require('./app/routes.js')(app, passport);

//launch
app.listen(port);
console.log("Server listening on port" + port);

ベストアンサー1

passport.session()ミドルウェアとして機能し、req オブジェクトを変更し、現在セッション ID (クライアント クッキーから) である 'user' 値を実際の逆シリアル化されたユーザー オブジェクトに変更します。

他の回答には良い点がいくつかありますが、もう少し具体的な詳細を提供できるのではないかと思いました。

app.use(passport.session());

は以下と同等である

app.use(passport.authenticate('session'));

ここで、「セッション」は、passportJS にバンドルされている次の戦略を指します。

ファイルへのリンクは次のとおりです:https://github.com/jaredhanson/passport/blob/master/lib/strategies/session.js

そしてパーマリンクこの記事の執筆時点では、次の行を指しています。

var property = req._passport.instance._userProperty || 'user';
req[property] = user;

これは基本的にミドルウェアとして機能し、req オブジェクトの 'user' プロパティの値を変更して、ユーザーの逆シリアル化された ID を含めます。これを正しく機能させるには、カスタム コードにserializeUserおよびdeserializeUser関数を含める必要があります。

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

passport.deserializeUser(function (user, done) {
    //If using Mongoose with MongoDB; if other you will need JS specific to that schema.
    User.findById(user.id, function (err, user) {
        done(err, user);
    });
});

これにより、データベースから正しいユーザーが検索され、それがクロージャ変数としてコールバックに渡されるdone(err,user);ため、上記のコードはpassport.session()req オブジェクト内の 'user' 値を置き換えて、次のミドルウェアに渡すことができます。

おすすめ記事