[node.js] 여권 직렬화 직렬화 해제 이해

Passport의 serialize 및 deserialize 방법의 워크 플로를 일반인에게 어떻게 설명 하시겠습니까?

  1. 어디로 user.id가야 passport.serializeUser합니까?

  2. 우리는 호출 passport.deserializeUser이 곳은 워크 플로우에 맞지 않는 후 괜찮아?

    // 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);
        });
    });
    

나는 아직도 내 머리를 감싸려고 노력하고 있습니다. 나는 완전한 작동하는 앱을 가지고 있으며 어떤 종류의 오류도 발생하지 않습니다.

나는 여기서 정확히 무슨 일이 일어나고 있는지 이해하고 싶습니까?

도움을 주시면 감사하겠습니다.



답변

  1. 어디로 user.id가야 passport.serializeUser합니까?

사용자 ID ( done함수 의 두 번째 인수로 제공 )는 세션에 저장되고 나중에 deserializeUser함수 를 통해 전체 객체를 검색하는 데 사용됩니다 .

serializeUser세션에 저장해야 할 사용자 개체의 데이터를 결정합니다. serializeUser 메소드의 결과는로 세션에 첨부됩니다 req.session.passport.user = {}. 예를 들어, (사용자 ID를 키로 제공 할 때)req.session.passport.user = {id: 'xyz'}

  1. 우리는 호출 passport.deserializeUser이 곳은 워크 플로우에 맞지 않는 후 괜찮아?

의 첫 번째 인수 deserializeUserdone함수 에 제공된 사용자 개체의 키에 해당 합니다 (1 참조). 따라서 전체 키는 해당 키를 사용하여 검색됩니다. 여기서 해당 키는 사용자 ID입니다 (키는 사용자 개체의 모든 키, 즉 이름, 전자 메일 등일 수 있음). 에서는 deserializeUser그 키 메모리 어레이 / 데이터베이스 또는 데이터 자원과 매칭된다.

페치 된 오브젝트는 다음과 같이 요청 오브젝트에 첨부됩니다. req.user

시각적 흐름

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
});


답변

Koa 및 koa-passport를 사용하는 사람 :

serializeUser 메소드에 설정된 사용자 키 (주로 해당 사용자의 고유 ID)가 다음에 저장됨을 알고 있어야합니다.

this.session.passport.user

done(null, user)deserializeUser에서 설정 한 경우 ‘user’는 데이터베이스의 일부 사용자 객체입니다.

this.req.user
또는
this.passport.user

어떤 이유로 this.userdeserializeUser 메서드에서 done (null, user)을 호출 할 때 Koa 컨텍스트가 설정되지 않습니다.

따라서 app.use (passport.session ())을 호출 한 후 자신의 미들웨어를 작성하여 this.user에 넣을 수 있습니다.

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

serializeUser 및 deserializeUser의 작동 방식이 확실하지 않은 경우 Twitter에서 확인하십시오. @yvanscher


답변