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
, set
및 destroy
메서드 를 구현하면 충분 합니다. 다음 코드가 작동합니다.
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와 같은 다른 상점에 대해 자세히 알아보십시오. (이름이 기억 나지 않는다)
'ProgramingTip' 카테고리의 다른 글
브라우저 간 북마크 / 즐겨 찾기에 추가 JavaScript (0) | 2020.11.02 |
---|---|
Qt“비공개 양성소 :”이것은 무엇입니까? (0) | 2020.11.02 |
필요한에 배경을 추가해야합니까? (0) | 2020.11.02 |
C #의 암호 (0) | 2020.11.02 |
코드 흐름을하는 도구 (C / C ++) (0) | 2020.11.02 |