Passport의 serialize 및 deserialize 방법의 워크 플로를 일반인에게 어떻게 설명 하시겠습니까?
-
어디로
user.id
가야passport.serializeUser
합니까? -
우리는 호출
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); }); });
나는 아직도 내 머리를 감싸려고 노력하고 있습니다. 나는 완전한 작동하는 앱을 가지고 있으며 어떤 종류의 오류도 발생하지 않습니다.
나는 여기서 정확히 무슨 일이 일어나고 있는지 이해하고 싶습니까?
도움을 주시면 감사하겠습니다.
답변
- 어디로
user.id
가야passport.serializeUser
합니까?
사용자 ID ( done
함수 의 두 번째 인수로 제공 )는 세션에 저장되고 나중에 deserializeUser
함수 를 통해 전체 객체를 검색하는 데 사용됩니다 .
serializeUser
세션에 저장해야 할 사용자 개체의 데이터를 결정합니다. serializeUser 메소드의 결과는로 세션에 첨부됩니다 req.session.passport.user = {}
. 예를 들어, (사용자 ID를 키로 제공 할 때)req.session.passport.user = {id: 'xyz'}
- 우리는 호출
passport.deserializeUser
이 곳은 워크 플로우에 맞지 않는 후 괜찮아?
의 첫 번째 인수 deserializeUser
는 done
함수 에 제공된 사용자 개체의 키에 해당 합니다 (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.user
deserializeUser 메서드에서 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