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


125

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);

답변:


139

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


이봐, 난 세션에서 사용자 정보를 저장할 수있는 방법 만 내가 직접 컴파일 데이터베이스에 저장 싶지 않다
Newbiee

1
"요청 헤더에"? 요청 객체에만 없습니다
caub

세션 전략이 인증을 복원하고 사용자를 역 직렬화 할 수 있는지 확인했습니다. 그러나 그럼에도 불구하고 인증은 여전히 ​​내 시나리오에서 facebook 인증 인 다음 전략으로 이동합니다. 세션이 사용자를 복구 할 수 있어도 계속해서 다음과 같은 전략을 호출한다면 세션 전략의 요점은 무엇일까.
nishant

15

로부터 문서

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

세션

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

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

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


1
빠른 답장을 보내 주셔서 감사하지만 제 질문에 대한 답변이 아닙니다. 또한 Express 응용 프로그램이 있고 Express 서버에 연결하는 모든 클라이언트에서 express.session ()을 사용하는 경우 (인증 여부에 관계없이) 쿠키를 통해 세션이 제공됩니다. 그것은 그가 귀하의 앱의 로그인 보호 페이지에 있는지 여부와 무관합니다. 여전히 두 미들웨어의 차이점을 알고 싶습니다.
Georges Krinker 2014

1
@GeorgesKrinker는 serializeUser () 및 deserializeUser 메서드입니다. 익스프레스 미들웨어는 세션 정보를 복원하지만 여권이 사용자 정보를 관리하는 방법과 반드시 ​​관련이있는 것은 아닙니다. 그것은 세션이 급행으로 재수 화 된 후에 수행되어야합니다.
Josh C.

나는 serializeUser () 및 deserializeUser 메서드가 경로 내에서 authenticate ()에서 실행되었다는 인상을 받았습니다.
Georges Krinker 2014

@GeorgesKrinker 나는 그렇게 생각하지 않는다. 여권을 사용할 때 로그인 할 때만 .authenticate를 호출했습니다.
Josh C.

app.post('/login', passport.authenticate('local'), ...
Josh C.

11

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

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

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


11

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

passport.authenticate('session');

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

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


6
무슨 말이야? 모든 요청에서 실행되며 인증 할 자격 증명이 반드시 필요한 것은 아닙니다. 각 요청에서 발생하는 워크 플로에 대해 좀 더 자세히 설명해 주시겠습니까?
Georges Krinker 2014

6
예, 모든 요청에 ​​따라 실행됩니다. Express에서 생성되는 세션 ID는 브라우저가 모든 요청과 함께 보내는 인증 토큰과 거의 동일한 고유 ID입니다. 이 세션에 저장된 데이터는 사용자의 인증 상태를 복원하는 데 사용됩니다.
Jared Hanson

안녕하세요 @JaredHanson 이것 좀 봐 주실 수 있나요 ? 어디에서도 답을 찾을 수 없습니까?
Saras Arya 2015

@JaredHanson OAuth2를 준수하는 널리 사용되는 오픈 소스 인증 서버로 인증하기 위해 passport.js를 사용하려고합니다. 하지만 오류가 발생합니다. 문제 해결을 기꺼이 도와 주시겠습니까? 여기 링크입니다 : stackoverflow.com/questions/38176236/...
DollarCoffee

@JaredHanson : 내가 관찰 한 것은 google-oauth를 통해 로그인 한 직후에 passport.user 정보로 보강 된 req 객체가 사이트에서 새 페이지에 대한 다음 요청이 수행 될 때 손실된다는 것입니다. 이 예상 된 동작입니까? 그렇다면 최근에 로그인 한 사용자 정보를 되 찾는 방법을 잃어 버렸습니다.
user1102171
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.