2012-10-18 4 views
12

Przeczytałem ten temat Node.js + express.js + passport.js : stay authenticated between server restart i potrzebuję dokładnie tego samego, ale dla Redis. Użyłem takiego kodu:Nodejs + Passport.js + Redis: jak przechowywać sesje w Redis

var RedisStore = require('connect-redis')(express); 
app.use(express.session({ 
    secret: "my secret", 
    store: new RedisStore, 
     cookie: { secure: true, maxAge:86400000 } 
})); 

I to nie działa. Do połączenia Redis używam modułu connect-redis. Co robię źle? Dzięki!

UPD: Nie dostaję żadnych błędów. Aby proces uwierzytelniania przebiegał pomyślnie, dodałem linię logu i jest ona wykonywana.

function(email, password, done) { 
    // asynchronous verification, for effect... 
    process.nextTick(function() { 
     findByEmail(email, function(err, user) { 
      if (!user) { 
       return done(null, false, { 
        message: 'Unknown user ' + email 
       }); 
      } 
      if (user.password != password) { 
       return done(null, false, { 
        message: 'Invalid password' 
       }); 
      } 
      //just logging that eveything seems fine 
      console.log("STATUS: User " + email + " authentificated succesfully"); 
      return done(null, user); 
     }) 
    }); 
})); 

Log z express.logger() włączone było:

127.0.0.1 - - [Fri, 19 Oct 2012 05:49:09 GMT] "GET /ico/favicon.ico HTTP/1.1" 404 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4" 
STATUS: User admin authentificated succesfully 

zrobić przypuszczać, że nie ma nic złego z auth/users/referencje/szeregowania/deserializacji się. Problem polega tylko na tym, że paszport nie może ustawić pliku cookie w Redis i przeczytać go.

+0

Co nie działa? Jaki błąd dostałeś? – Max

+0

Zaktualizowałem swój post. – f1nn

+0

"paszport nie może ustawić pliku cookie na Redis i przeczytać go." To nie ma sensu. – Ben

Odpowiedz

5

należy używać

cookie: { secure: false, maxAge:86400000 } 
+2

Ustawienie 'secure: false' oznacza, że ​​twoje sesyjne pliki cookie mogą być wysyłane bez SSL, co naraża na przechwytywanie sesji. http://en.wikipedia.org/wiki/Session_hijacking – Alan

+2

Nie jest dobrym pomysłem, aby używać plików cookie zamiast sesji. –

+0

Możesz to zrobić dla rozwoju, ale upewnij się, że ustawiono wartość secure na true w produkcji. Możesz to zrobić za pomocą zmiennej środowiskowej dość łatwo. – Porlune

0

Co się dzieje, gdy w sklepie można ustawić jawnie? np. coś pod tymi liniami w Twojej aplikacji:

var redis = require('redis'); 
// This is host and port-dependent, obviously 
var redisClient= redis.createClient(6379, 'localhost'); 

app.use(express.session({ 
    secret: 'your secret', 
    /* set up your cookie how you want */ 
    cookie: { maxAge: ... }, 
    store: new (require('express-sessions'))({ 
     storage: 'redis', 
     instance: redisClient 
    }) 
}));