Zrozumienie passport serialize deserialize

Jak wyjaśniłbyś laikowi proces serializacji i deserializacji paszportu?

  1. Gdzie jest user.id po wywołaniu passport.serializeUser?

  2. Wywołujemy passport.deserializeUser zaraz po nim, gdzie mieści się w obiegu pracy?

    // used to serialize the user for the session
    passport.serializeUser(function(user, done) {
        done(null, user.id); 
       // where is this user.id going? Are we supposed to access this anywhere?
    });
    
    // used to deserialize the user
    passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });
    
Wciąż próbuję to ogarnąć. Mam kompletną działającą aplikację i nie napotkam żadnych błędów. Chciałem tylko zrozumieć, co się dokładnie dzieje. tutaj? Każda pomoc jest mile widziana.
Author: Sunil Garg, 2014-12-24

2 answers

  1. gdzie user.id idź po paszport.serializeUser został wywołany?

Identyfikator użytkownika (podany jako drugi argument funkcji done) jest zapisywany w sesji, a następnie używany do pobierania całego obiektu za pomocą funkcji deserializeUser.

serializeUser określa, które DANE obiektu Użytkownika mają być przechowywane w sesji. Wynik metody serializeUser jest dołączony do sesji jako req.session.passport.user = {}. Tutaj na przykład, byłoby (jak my podaj identyfikator użytkownika jako klucz) req.session.passport.user = {id:'xyz'}

    Dzwonimy do Paszportu.deserializeUser zaraz po nim gdzie mieści się w obiegu pracy?

Pierwszy argument deserializeUser odpowiada kluczowi obiektu user, który został podany funkcji done (Patrz 1.). Więc cały twój obiekt jest odzyskiwany za pomocą tego klucza. Tym kluczem jest tutaj identyfikator użytkownika (kluczem może być dowolny klucz obiektu user, np. nazwa, email itp.). W deserializeUser Ten klucz jest dopasowany do pamięci tablica / baza danych lub dowolny zasób danych.

Pobrany obiekt jest dołączony do obiektu request jako req.user

Przepływ Wzrokowy

passport.serializeUser(function(user, done) {
    done(null, user.id);
                 |
});              | 
                 |
                 |____________________> saved to session req.session.passport.user = {id:'..'}
                                   |
                                  \|/           
passport.deserializeUser(function(id, done) {
                   ________________|
                   |
                  \|/ 
    User.findById(id, function(err, user) {
        done(err, user);
                   |______________>user object attaches to the request as req.user

 });
  });
 285
Author: A.B,
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-12-14 15:11:04

Dla każdego, kto używa Koa i Koa-paszport :

Wiedz, że klucz dla użytkownika ustawiony w metodzie serializeUser (często unikalny identyfikator dla tego użytkownika) będzie przechowywany w:

this.session.passport.user

Gdy ustawisz done(null, user) w deserializeUser gdzie 'user' jest jakimś obiektem user z twojej bazy danych:

this.req.user Lub this.passport.user

Z jakiegoś powodu this.user kontekst Koa nigdy nie zostanie ustawiony podczas wywołania done (null, user) w metodzie deserializeUser.

Więc możesz napisać swój własny middleware po wezwaniu do aplikacji.użycie (bułg.session ()) aby umieścić go w tym.user like so:

app.use(function * setUserInContext (next) {
  this.user = this.req.user
  yield next
})

Jeśli nie wiesz, jak działają serializeUser i deserializeUser, po prostu skontaktuj się ze mną na Twitterze. @ yvanscher

 14
Author: yvanscher,
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
2016-03-18 21:12:58