2013-06-21 2 views
2

저는 Couch 및 Redis와 함께 Express 응용 프로그램을 로컬로 구축했습니다. 그것은 잘 작동하고 있습니다.Express 'Connect-Redis를 사용하여 원격 Redis 서버에 세션 저장

이제 Iris Redis에서 호스팅되는 원격 Redis 서버를 사용하려고합니다. 나는 며칠 째 시도했지만 Express의 'Connect-redis'를 통해 Passport의 로컬 전략으로 인증 한 후 쿠키를 반환하는 것처럼 보이지 않습니다. 그러나 로컬 Redis 서버가 실행 중일 때도 정상적으로 작동합니다.

app.configure(function(){ 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use('/upload', upload.fileHandler()); 
app.use(express.bodyParser({ keepExtensions: true, uploadDir: 'public/uploads' })); 
app.use(express.methodOverride()); 
app.use(express.cookieParser()); 
app.use(express.session({ cookie: { maxAge: 60000000 }, secret: "sauce", store: new RedisStore({ 
    port: 6379, 
    host: 'url', 
    pass: 'sauce' 
}) })); 
app.use(flash()); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(app.router); 
app.use(express.static(path.join(__dirname, 'public'))); 

});


// Authentication 
passport.use(new LocalStrategy(function(username, password, done) { 

username = username.toLowerCase(); 
db.get(username, function (err, doc) { 

    if (err) { 
    console.log(err); 
    return done(err); 
    } 
    if (!doc) { 
    return done(null, false, { message: 'No user by that name.' }); 
    } 
    if (doc.password !== password) { 
    return done(null, false, { message: 'Incorrect password.' }); 
    } 
    return done(null, doc); 
    }); 

    }) 
); 

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

passport.deserializeUser(function (userId, done) { 
    db.get(userId, function(err, user){ 
    if(err){ 
     return (500, err); 
    } else {         
    done(null, _.omit(user, ["password"])); 
    } 
    }); 
}); 

// Route 
exports.authenticate = passport.authenticate('local', { 
successRedirect: '/', 
failureRedirect: '/login' 
}); 

답변

1

당신은 레디 스의 DB를 지정하는 것 같지 않습니다 그것은 실패의 원인이 될 수 있습니다.

더 일반적으로 환경 변수에 URL을 사용하여 redis 매개 변수를 저장하고 로컬 또는 원격 서버에 연결하는 것과 동일한 구문 분석 코드를 사용하는 것이 좋습니다.

var config = require('./config/config.js') 

app.use(express.session({ 
    store: new RedisStore({ 
     port: config.redisPort, 
     host: config.redisHost, 
     db: config.redisDatabase, 
     pass: config.redisPassword}), 
    secret: 'pick a good password', 
    proxy: true, // necessary if you're behind a proxy 
    cookie: { secure: true } 
})) 

을 그리고 config.js :

var url = require('url') 
var config = {}; 
var redisUrl; 

if (typeof(process.env.REDISTOGO_URL) != 'undefined') { 
    redisUrl = url.parse(process.env.REDISTOGO_URL); 
} 
else redisUrl = url.parse('redis://:@127.0.0.1:6379/0'); 

config.redisProtocol = redisUrl.protocol.substr(0, redisUrl.protocol.length - 1); // Remove trailing ':' 
config.redisUsername = redisUrl.auth.split(':')[0]; 
config.redisPassword = redisUrl.auth.split(':')[1]; 
config.redisHost = redisUrl.hostname; 
config.redisPort = redisUrl.port; 
config.redisDatabase = redisUrl.path.substring(1); 

console.log('Using Redis store ' + config.redisDatabase) 

module.exports = config; 
예를 들어, app.js에서
관련 문제