2

我一直在本地与 Couch 和 Redis 一起构建 Express 应用程序。它一直运行良好。

我现在正在寻求使用托管在 Iris Redis 上的远程 Redis 服务器。我已经尝试了好几天,但似乎无法让 Express 的 Connect-redis 在使用 Passport 的本地策略进行身份验证后返回 cookie。这工作得很好,但是当我有一个本地 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'
});
4

1 回答 1

1

您似乎没有指定 redis 数据库;这可能是失败的原因。

更一般地说,我建议在环境变量中使用 URL 来存储 redis 参数,因此无论您连接到本地服务器还是远程服务器,都具有相同的解析代码。例如,来自 app.js:

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;
于 2013-06-22T01:50:17.837 回答