Praca z sesjami w Expressie.js

Potrzebuję pomocy w zrozumieniu koncepcji sesji dla aplikacji webowej. Prowadzę węzeł.serwer js z Express 3.0.

Moje Cele to:

  • Tworzenie sesji dla każdego użytkownika logującego się

  • Przechowuj tę sesję i używaj jej do sprawdzania, czy użytkownik jest już zalogowany (zapobiegaj dwóm urządzeniom używającym tego samego Użytkownika w tym samym czasie) i ograniczaj dostęp do niektórych stron (dopasowując identyfikator sesji do innych danych)

Będę używanie MemoryStore do zapisywania sesji (wydaje się najłatwiejsze). Jeśli powyższe cele mają sens, możesz podać dokładne wyjaśnienie, jak je osiągnąć?

Author: cesarcruz91, 2013-01-08

2 answers

Express ma ładneprzykłady w repo github. Jeden z nich zajmuje się uwierzytelnianiem i pokazuje jak dołączyć użytkownika do obiektu req.session. Odbywa się to wewnątrz trasy app.post('/login').

Aby ograniczyć dostęp do niektórych stron Dodaj proste oprogramowanie pośredniczące do tych tras

function restrict(req, res, next) {
  if (req.session.user) {
    next();
  } else {
    req.session.error = 'Access denied!';
    res.redirect('/login');
  }
}

app.get('/restricted', restrict, function(req, res){
  res.send('Wahoo! restricted area, click to <a href="/logout">logout</a>');
});

Jako Brandon już wspomniałem, że nie powinieneś używać MemoryStore w produkcji. Redis to dobra alternatywa. Użyj connect-redis , aby uzyskać dostęp do db. Przykładowa konfiguracja wygląda tak

var RedisStore = require('connect-redis')(express);

// add this to your app.configure
app.use(express.session({
  secret: "kqsdjfmlksdhfhzirzeoibrzecrbzuzefcuercazeafxzeokwdfzeijfxcerig",
  store: new RedisStore({ host: 'localhost', port: 3000, client: redis })
}));
 39
Author: zemirco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:19

Używaj MemoryStore w express tylko wtedy, gdy nie tworzysz wielu instancji(np. z modułem klastra). Jeśli równoważenie obciążenia odbywa się na różnych maszynach, load balancer będzie musiał używać sesji sticky / persistent.

Jeśli spełniasz te wymagania, wszystko, co musisz zrobić, to po zalogowaniu, po zatwierdzeniu poświadczeń Ustaw zmienną sesji, aby wskazać zalogowanego, na przykład:

req.session.loggedIn = true;

Jeśli chcesz sprawdzić, czy użytkownik jest zalogowany, po prostu sprawdź, że zmienna.

if (req.session.loggedIn) {
    // user is logged in.
}
else {
    // user is not logged in.
}

Wspomniałeś o zapobieganiu pojedynczemu użytkownikowi posiadania sesji więcej niż jednej sesji na raz. Aby to osiągnąć, może być konieczne przechowywanie czegoś w bazie danych wskazującej, że użytkownik jest zalogowany. Ostrzegam, to może być niebezpieczne z powodu nieświeżych sesji. Na przykład, co się stanie, jeśli użytkownik zaloguje się, ale nigdy się nie wyloguje? Co jeśli zamkną okno przeglądarki, aby sesja zniknęła na zawsze?

Express nie ma pojęcia o bezczynnym wygaśnięciu sesji. Mam zaimplementowano takie coś, przechowując wszystkie sesje w bazie danych wraz z ostatnio dostępnym znacznikiem czasu, a następnie okresowo czyścić dane sesji na podstawie czasu. Ale potem musisz zaktualizować swoją listę, kto jest zalogowany.

 10
Author: Brandon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-08 19:35:05