[node.js] passport.session () 미들웨어는 무엇을합니까?

Easy Node Authentication : Setup and Local tutorial을 사용하여 Passport.js를 사용하여 인증 시스템을 구축하고 있습니다 .

나는 무엇을하는지 혼란 스럽다 passport.session().

서로 다른 미들웨어와 놀아 후 나는 이해했다 express.session()클라이언트에 쿠키를 통해 세션 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);



답변

passport.session() req 개체를 변경하고 현재 세션 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;

본질적으로 미들웨어 역할을하며 사용자의 역 직렬화 된 ID를 포함하도록 req 개체의 ‘user’속성 값을 변경합니다. 이것이 올바르게 작동하려면 사용자 정의 코드에 serializeUserdeserializeUser기능을 포함해야합니다 .

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’값을 대체하고 더미의 다음 미들웨어로 전달할 수 있습니다.


답변

로부터 문서

Connect 또는 Express 기반 애플리케이션에서 Passport를 초기화하려면 passport.initialize () 미들웨어가 필요합니다. 애플리케이션이 영구 로그인 세션을 사용하는 경우 passport.session () 미들웨어도 사용해야합니다.

세션

일반적인 웹 응용 프로그램에서 사용자 인증에 사용되는 자격 증명은 로그인 요청 중에 만 전송됩니다. 인증이 성공하면 사용자 브라우저에 설정된 쿠키를 통해 세션이 설정되고 유지됩니다.

각 후속 요청에는 자격 증명이 아니라 세션을 식별하는 고유 한 쿠키가 포함됩니다. 로그인 세션을 지원하기 위해 Passport는 세션에서 사용자 인스턴스를 직렬화 및 역 직렬화합니다.

세션 지원을 활성화하는 것은 전적으로 선택 사항이지만 대부분의 응용 프로그램에 권장됩니다. 활성화 된 경우, passport.session () 전에 express.session ()을 사용하여 로그인 세션이 올바른 순서로 복원되었는지 확인하십시오.


답변

PassportJs로그인 URL의 일부로 사용자의 유효성을 검사하는 데 사용하는 동안에도 세션에이 사용자 정보를 저장하고 모든 후속 요청에서 검색 (즉, 사용자 직렬화 / 역 직렬화)하기위한 몇 가지 메커니즘이 필요합니다.

따라서 실제로는이 인증이 로그인 응답에서와 같이 데이터베이스 또는 oauth를 조회 할 필요가 없더라도 모든 요청으로 사용자를 인증합니다. 따라서 여권은 세션 인증을 또 다른 인증 전략으로 취급합니다.

그리고이 전략을 사용하려면-라는 이름 session의 간단한 단축키를 사용하십시오- app.use(passport.session()). 또한이 특정 전략은 명백한 이유로 직렬화 및 역 직렬화 기능을 구현하기를 원할 것입니다.


답변

단순히 세션 (로 채워짐 express.session()) 을 인증합니다 . 다음과 동일합니다.

passport.authenticate('session');

여기 코드에서 볼 수 있습니다.

https://github.com/jaredhanson/passport/blob/42ff63c/lib/authenticator.js#L233


답변