web-dev-qa-db-ja.com

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

Easy Node Authentication:Setup and Local tutorial を使用してPassport.jsを使用して認証システムを構築しています。

passport.session()の動作について混乱しています。

さまざまなミドルウェアで遊んだ後、express.session()がCookieを介してクライアントにセッションIDを送信するのは理解できましたが、passport.session()が何をするのか、そしてexpress.session()に加えてそれが必要な理由について混乱しています。

アプリケーションのセットアップ方法は次のとおりです。

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

//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);
103
Georges Krinker

passport.session()はミドルウェアとして機能し、reqオブジェクトを変更し、現在(クライアントCookieからの)セッションIDである「ユーザー」値を真のデシリアライズされたユーザーオブジェクトに変更します。

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

app.use(passport.session());

と同等です

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

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

https://github.com/jaredhanson/passport/blob/master/lib/strategies/session.js

具体的には59〜60行目:

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'値を置き換えて、山の次のミドルウェア。

106
lindsaymacvean

ドキュメント から

ConnectまたはExpressベースのアプリケーションでは、Passportを初期化するためにpassport.initialize()ミドルウェアが必要です。アプリケーションが永続的なログインセッションを使用する場合、passport.session()ミドルウェアも使用する必要があります。

そして

セッション

一般的なWebアプリケーションでは、ユーザーの認証に使用される資格情報は、ログインリクエスト中にのみ送信されます。認証が成功すると、ユーザーのブラウザーに設定されたCookieを介してセッションが確立および維持されます。

後続の各リクエストには資格情報は含まれず、セッションを識別する一意のCookieが含まれます。ログインセッションをサポートするために、Passportはセッションとの間でユーザーインスタンスをシリアル化および非シリアル化します。

そして

セッションサポートの有効化は完全にオプションですが、ほとんどのアプリケーションで推奨されています。有効にした場合は、passport.session()の前にexpress.session()を使用して、ログインセッションが正しい順序で復元されるようにしてください。

13
Josh C.

ログインURLの一部としてユーザーを検証するためにPassportJsを使用しますが、このユーザー情報をセッションに保存し、以降のすべてのリクエストで取得する(つまり、ユーザーをシリアル化/逆シリアル化する)ための何らかのメカニズムが必要です。

したがって、実際には、この認証はログイン応答のようにデータベースまたはoauthを検索する必要はありませんが、すべてのリクエストでユーザーを認証しています。そのため、パスポートはセッション認証をさらに別の認証戦略として扱います。

sessionという名前のこの戦略を使用するには、単純なショートカットapp.use(passport.session())を使用します。また、この特定の戦略では、明らかな理由で関数のシリアル化と逆シリアル化を実装する必要があることに注意してください。

10
uniwalker

セッションを認証するだけです(express.session()によって生成されます)。以下と同等です。

passport.authenticate('session');

ここのコードに見られるように:

https://github.com/jaredhanson/passport/blob/master/lib/authenticator.js#L236

9
Jared Hanson