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’속성 값을 변경합니다. 이것이 올바르게 작동하려면 사용자 정의 코드에 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’값을 대체하고 더미의 다음 미들웨어로 전달할 수 있습니다.
답변
로부터 문서
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