ProgramingTip

Node.js + express.js + passport.js : 서버 재시작 사이에 인증 유지

bestdevel 2020. 11. 2. 08:11
반응형

Node.js + express.js + passport.js : 서버 재시작 사이에 인증 유지


내 nodejs + express.js 응용 프로그램에서 인증을 처리하기 위해 passport.js를 사용합니다. mongodb에서 사용자를 가져 오기 위해 LocalStrategy를 설정했습니다.

내 문제는 노드 서버를 다시 시작할 때 사용자가 다시 인증해야한다는 것 입니다. 이것은 내가 적극적으로 개발 중이며 다시 시작할 때마다 로그인하고하지 않기 때문에 문제입니다 ... (+ 노드 감독 튼튼합니다)

내 앱 설정은 다음과 가변합니다.

app.configure(function(){
    app.use('/static', express.static(__dirname + '/static'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser());
    app.use(express.session({secret:'something'}));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
});

세션 화 설정 :

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

passport.deserializeUser(function(email, done) {
    User.findOne({email:email}, function(err, user) {
        done(err, user);
    });
});

성공하지 않고 connect-mongodb를 사용하여 블로그 (더 이상 존재하지 않는 링크 제거)에 솔루션을 시도했습니다.

app.use(express.session({
    secret:'something else',
    cookie: {maxAge: 60000 * 60 * 24 * 30}, // 30 days
        store: MongoDBStore({
        db: mongoose.connection.db
    })
}));

추가 문제 수정 : 하나만 연결해야 함 (하나의 연결 제한 mongohq 무료 서비스 사용)

2 솔루션 편집 (내 평판이 중간 서 지금까지 내 질문에 대답하기

몽구스 시작 연결을 사용하여 최종 해결책은 다음과 사용할 수 있습니다.

app.use(express.session({
    secret:'awesome unicorns',
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(
        {db:mongoose.connection.db},
        function(err){
            console.log(err || 'connect-mongodb setup ok');
        })
}));

필요한 것을 정확히 수행하는 connect- mongo라는 오픈 소스가 있습니다 . mongodb에서 세션 데이터를 유지합니다.

사용 예 ( mongoose열린 연결 재사용 ) :

var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/sess');
app.use(express.session({
    secret:'secret',
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(
    // Following lines of code doesn't work
    // with the connect-mongo version 1.2.1(2016-06-20).
    //    {db:mongoose.connection.db},
    //    function(err){
    //        console.log(err || 'connect-mongodb setup ok');
    //   }
    {mongooseConnection:mongoose.connection}
    )        
}));

자세한 내용은 https://github.com/kcbanner/connect-mongo 에서 확인할 수 있습니다.


나는 다음과 같이 connect-mongo를 사용합니다.

var MongoStore = require('connect-mongo');

var sess_conf = {
  db: {
    db: mydb,
    host: localhost,
    collection: 'usersessions' // optional, default: sessions
  },
  secret: 'ioudrhgowiehgio'
};

 app.use(express.session({
    secret: sess_conf.secret,
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(sess_conf.db)
  }));


[...]

// Initialize Passport!  Also use passport.session() middleware, to support
  // persistent login sessions (recommended).
  app.use(passport.initialize());
  app.use(passport.session());

이것은 세션에 MemoryStore를 사용하기 때문입니다. memory.js (Connect 프레임 워크의 일부) 에서이 코드를 제거합니다.

var MemoryStore = module.exports = function MemoryStore() {
  this.sessions = {};
};

session.js (Express) 의이 스 니펫

function session(options){
    /* some code */
    , store = options.store || new MemoryStore
    /* some code */
}

이제 서버를 다시 시작할 때마다 MemoryStore가 재설정된다는 것을 이해해야합니다. 데이터를 유지하려면 다른 세션 저장소를 사용해야합니다. Redis ( 이 라이브러리 참조 )가 좋은 선택 일 수 있지만 (그리고 Express에서 잘 지원 되지만) 직접 작성할 수도 있습니다 (너무 어렵지는 않습니다 ).

// 편집하다

Connect 문서 에 따르면 get, setdestroy메서드 를 구현하면 충분 합니다. 다음 코드가 작동합니다.

customStore = {
    get : function(sid, callback) {
        // custom code, for example calling MongoDb
    },
    set : function(sid, session, callback) {
        // custom code
    },
    destroy : function(sid, callback) {
        // custom code
    }
}    

app.use(express.session({
    store: customStore
}));

세션 데이터를 저장하기 위해 MongoDb (또는 Redis와 같은 비 영구 DB를 사용하는 것이 좋지만 다른 Db) 호출을 구현하면됩니다. 또한 아이디어를 얻기 위해 다른 구현의 소스 코드를 읽으십시오.


이것은 숙련 된 노드 사용자에게 분명하지만 나를 잡았습니다.

노드 세션을 구성해야합니다. 예 :

app.use(session({secret: "this_is_secret", store: ...}));

여권 세션을 초기화 하기 전에 -예

app.use(passport.initialize());
app.use(passport.session());

먼저 passport.session ()을 호출하면 작동하지 않으며 경고도하지 않습니다. 문제는 직렬화 / 역 직렬화 사용자 기능과 낭비 된 시간에 있다고 생각했습니다.


나는 몽구스를 사용하고 있으며 위의 답변에 제시된 코드를 시도했지만 작동하지 않았습니다. 내가 할 때이 오류가 발생했습니다.

Error: db object already connecting, open cannot be called multiple times

그러나 이것은 나를 위해 작동합니다.

app.use(express.session({
    secret:'secret',
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore({mongoose_connection:mongoose.connection})
}))

참고 : 어떤 이유로 든 MongoStore가없는 경우 다음을 수행해야합니다.

npm install connect-mongo --save

그때:

var MongoStore = require('connect-mongo')(express)

내가 한 일 :

var expressSession = require('express-session');
var redisClient = require('redis').createClient();
var RedisStore = require('connect-redis')(expressSession);
...
app.use(expressSession({
    resave: true,
    saveUninitialized: true,
    key: config.session.key,
    secret: config.session.secret,
    store: new RedisStore({
        client: redisClient,
        host: config.db.host,
        port: config.db.port,
        prefix: 'my-app_',
        disableTTL: true
    })
}));

나를 위해 작동합니다.


세션에 사용중인 상점을 변경해야합니다. 기본 'MemoryStore'는 응용 프로그램이 중지 될 때 세션을 계속 저장하지 않습니다. github의 익스프레스 세션을 확인하여 mongo와 같은 다른 상점에 대해 자세히 알아보십시오. (이름이 기억 나지 않는다)

참고 URL : https://stackoverflow.com/questions/10164312/node-js-express-js-passport-js-stay-authenticated-between-server-restart

반응형