code

여권 직렬화 역직렬화 이해

starcafe 2023. 5. 13. 10:27
반응형

여권 직렬화 역직렬화 이해

일반인에게 패스포트의 직렬화 및 역직렬화 방법의 워크플로우를 어떻게 설명하시겠습니까?

  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는 " " " ID"의 두 합니다.)donefunction에 function을 하는 데 됩니다.deserializeUser기능.

serializeUser세션에 저장할 사용자 개체의 데이터를 결정합니다. 련의 결과화일메 User 되어 있습니다.req.session.passport.user = {}들어 서는 (키로 하므로) 예를들어, 사는서를 (용자키 ID제므로하)가.req.session.passport.user = {id: 'xyz'}

  1. 전화드렸습니다.passport.deserializeUser워크플로우의 어디에 적합합니까?

번째주의 첫 deserializeUser에 주어진 사용자 객체의 키에 해당합니다.done함수. 조참) 그래서 의 전체 은 그 됩니다.그래서 당신의 전체 객체는 그 키의 도움으로 검색됩니다.여기서 해당 키는 사용자 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를 사용하는 모든 사용자:

serialize에 설정된 사용자의 키를 확인합니다.사용자 메서드(종종 해당 사용자의 고유 ID)는 다음 위치에 저장됩니다.

this.session.passport.user

에 할 때done(null, user)역직렬화하여user 여기서 'user'는 데이터베이스의 일부 사용자 개체입니다.

this.req.userORthis.passport.user

this.userdeserialized deserialize에서 (null, 하면 koa 컨텍스트되지 않습니다.사용자 방법.

따라서 app.use(passport.session()) 호출 후에 자신의 미들웨어를 작성하여 다음과 같이 입력할 수 있습니다.user:

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

연쇄 살인범들이 어떻게 연쇄 살인범들을사용자 및 역직렬화사용자 작업, 트위터로 연락 주세요.@yvanscher

은 여권사를 합니다.serializeUser(인증에 성공한 후) 사용자 데이터를 세션으로 유지하는 기능입니다. 기.deserializeUser세션에서 사용자 데이터를 검색하는 데 사용됩니다.

둘다요.serializeUser그리고.deserializeUser 전달받은 function, type function이면 function, function,serializeUser그리고.deserializeUser아무 것도 하지 않고 함수 스택에 함수를 저장합니다. 함수 스택은 나중에 호출됩니다(전달된 첫 번째 인수가 형식 함수가 아닐 때).세션에서 인증 후 사용자 데이터를 저장하려면 다음 설정이 필요합니다.

app.use(session({ secret: "cats" }));
app.use(passport.initialize());
app.use(passport.session());

중고 미들웨어의 순서가 중요합니다.새 요청이 승인을 위해 시작되면 어떤 일이 발생하는지 확인하는 것이 중요합니다.

  • 는 세션을합니다(" " "의를 사용합니다").sessionStore).

  • passport.initialize할당합니다._passport to object, object가 는 " ", ", ", ", ", "passport않으면 - 합니다). 를 해당 존존개재함체에경다에생 - 성해니할), 당개를체합당않우에 할당합니다.session에 출전하다._passport마지막에는 다음과 같이 표시됩니다.

    req._passport.session = req.session['passport']
    

    그렇게,session필드 참조 객체, 할당된 객체req.session.passport.

  • passport.session.user에 출전하다.req._passport.session그리고 만약 하나를 찾으면, 그것을 건네줍니다.deserializeUser함수를 호출합니다. deserializeUser는 할함당을 할당합니다.req._passport.session.useruser요청 개체 필드(에서 찾을 경우)req._passport.session.user이것이 우리가 사용자 객체를 설정하는 이유입니다.serializeUser다음과 같은 기능:

    passport.serializeUser(function(user, done) {
      done(null, JSON.strignify(user)); 
    });
    

    저장되었기 에 구문 분석이 합니다. 왜냐하면 저장되었기 때문입니다.JSONuser선택사항:

     passport.deserializeUser(function(id, done) {
       // parsed user object will be set to request object field `user`
       done(err, JSON.parse(user));
     });
    

그렇게,deserializeUser은 먼저할 때 을 당이를 Passport설때할정, 의콜다위해먼저기호기능출된넣시을신당신에 넣기 위해됩니다._deserializers함수 스택.두 번째로, 그것은 소환될 것입니다.passport.session 할당하는 user요청 개체에 대한 필드입니다.의 콜백 콜백)을 합니다.passport.deserializeUser()에 ).user밭.밭.

serializeUserPassport를 할 때 먼저 Passport와 )deserializeUser함수)이지만 세션에 저장하기 위해 사용자 개체를 직렬화하는 데 사용됩니다.두 번째로, 그것은 전화될 것입니다, in.login/logIn (alias)세션에서 사용자 개체를 저장하는 데 사용되는 방법입니다. serializeUser 은 확인합니다._serializers이미 푸시된 it 기능이 있는 스택(Passport 설정 시 추가된 기능 중 하나):

passport.serializeUser(function(user, done) ...

개체를 " " " " " " " " " " " " " " " " " " " " " 에 합니다.req._passport.session.user그것을 기억하는 것은 중요합니다.session가 직접 합니다.passport에 출전하다.req.session물건.그런 방식으로 사용자가 세션에 저장되었습니다(왜냐하면req._passport.session 개체 조체req.session.passport,그리고.req._passport.session되는 각 에서 수되는 수정니다됩서에 의해 됩니다.passport.initialize미웨어들끝면나이요). 요청이 끝나면 청이끝,면▁나,req.session는 데터가저다니됩에 됩니다.sessionStore.

인증 성공 후 두 번째 요청이 시작될 때 발생하는 작업:

  • session는 미들어가기에서 을 얻습니다.sessionStore 데이터가 이미 입니다.
  • passport.initialize하고 세션을 할당합니다.req.session.passportreq._passport.session
  • passport.sessionreq._passport.session.user역직렬화합니다.이 단계에서 (만약에req._passport.session.user사실), 우리는 가질 것입니다.req.user그리고.req.isAuthenticated()아온다를 합니다.true.

그래서 저는 이것에 꽤 오래 걸려서 다시는 아무도 이 쓰레기에 걸리지 않도록 빠른 설정 파일을 만들었습니다.

여권 관리.js

const localStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
const User = require('./db-schemas/models').UserModel;
/*^^^^^^^^^^^ delete above import and modify below definition as needed 
const mongoose = require('mongoose')
mongoose.connect("mongodb://localhost:27017/database_name");

const UserSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    }
});
const UserModel = mongoose.model('collection_name', UserSchema);
^^^^^^^^^^^^^^^ Change UserModel to User */
const passport = require('passport');

function passportSetupUwU(app) {
    const cookieParser = require('cookie-parser');
    const session = require('express-session');
    const MongoDBStore = require('connect-mongodb-session')(session);

    app.use(cookieParser());
    app.set('trust proxy', 1);
    app.use(session({
    secret: "secret",
    resave: false,
    saveUninitialized: false,
    store: new MongoDBStore({
        uri: "mongodb://localhost:27017/database_name",
        collection: "collection_name"
    })
    }));

    // Passport.js
    app.use(passport.initialize());
    app.use(passport.session());
}

passport.serializeUser(function(user, cb) {
    console.log("serializing user uwu:" + JSON.stringify(user))
    process.nextTick(function() {
        return cb(null, user.id)
    })
})

passport.deserializeUser(function (id, cb) {
    console.log("deserializing user owo:" + JSON.stringify(id))
    User.findOne({id:id}, function (err, user) {
        if (err) { return cb(err)}
        return cb(null, user);
    })
});

passport.use(new localStrategy(function (username, password, done) {
    console.log("attempted login with %s:%s", username, password);
    User.findOne({ username: username }, function (err, user) {
        if (err) return done(err);
        if (!user) return done(null, false, { message: 'No such user exists.' });

        bcrypt.compare(password, user.password, function (err, res) {
            if (err) return done(err);
            if (res === false) return done(null, false, { message: 'Incorrect password.' });
            
            return done(null, user);
        });
    });
}));

module.exports = {setup: passportSetupUwU}

이제 app.js에서 여권SetupUwU 기능을 가져와서 실행하면 됩니다.

app.js extract

// some example middleware and stuff i happened to have
const PPSetup = require('./passportmgmt').setup
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));

//
// <- PUT IT LIKE HERE OR SOMETHING
//
PPSetup(app);

// some example routes and api endpoints i happened to have
app.use('/api/', apiRouter);
apiRouter.use('/', indexRouter);
apiRouter.use('/users', usersRouter);

apiRouter.post('/login', passport.authenticate('local', {

이 코드를 사용하여 이전 직렬화 및 역직렬화를 업그레이드할 수 있습니다. 새 솔루션을 사용하려면 이 게시물을 업로드하십시오.

        passport.serializeUser(function(user, cb) {
          process.nextTick(function() {
            cb(null, { id: user.id, username: user.username });
          });
        });
        
        passport.deserializeUser(function(user, cb) {
          process.nextTick(function() {
            return cb(null, user);
          });
        });

기본적으로 serializer를 사용하여 세션에 user-id를 저장하고 사용자 모델 인스턴스가 필요할 때 해당 user-id를 사용하여 deserializer를 사용하여 데이터베이스를 검색합니다.

세션이 활성화되고 사용자가 인증되는 한,

req.session.passport.user

항상 사용자 모델 인스턴스에 해당합니다.

사용자 ID를 세션에 저장하지 않고 리디렉션이 있으면 사용자 인증 여부를 알 수 없습니다.

사용자가 인증되면req.session.passport.user이 설정되므로 이후의 모든 요청은 사용자가 인증되었음을 알 수 있습니다.

이것이 단순화되기를 바랍니다.

Passport의 직렬화 및 역직렬화 방법에 대한 시각적 워크플로우:

  1. 사용자가 응용 프로그램에 로그인하고 자격 증명을 제공합니다.
  2. 여권은 일련 번호를 사용합니다.사용자 개체를 가져와 세션 개체로 변환하는 사용자 기능입니다.
  3. Passport는 세션 객체를 서버에 저장하고 세션 쿠키를 사용자의 브라우저로 전송합니다. 4.사용자가 애플리케이션에 요청합니다. 5.여권은 역직렬화를 사용합니다.세션 개체를 가져와 사용자 개체로 다시 변환하는 사용자 기능입니다.
  4. 여권은 사용자 개체를 응용프로그램으로 전달하고, 응용프로그램은 이 개체를 사용하여 사용자가 인증되었는지 여부를 확인할 수 있습니다.
  5. 사용자가 인증되면 응용 프로그램에서 요청된 리소스에 액세스할 수 있습니다.
  6. 사용자가 인증되지 않은 경우 응용 프로그램이 액세스를 거부하고 로그인 페이지로 리디렉션합니다.

다음은 워크플로우를 시각적으로 표현한 것은 다음과 같습니다.

    +------------+             +---------------+
|            |             |               |
| User Login |             | Session Object |
|            |    serializeUser    |               |
+-----+------+   ------------------>   +---------+
      |                                 |           |
      |                                 | Store on  |
      |                                 | Server    |
      |                                 |           |
+-----+------+   <------------------   +---------+
|            |             |               |
| User Request |    deserializeUser    |               |
|            |   ------------------>   |             |
+------------+             |               +-----------+
      |                   |
      |                   |
      |                   |
+-----+------+   <------------------   +---------+
|            |             |               |
| Authenticated |             |     User     |
|  or not       |             |             |
|            |             |               |
+------------+             +---------------+

이것이 패스포트의 직렬화 및 역직렬화 방법의 작업 흐름을 명확히 하는 데 도움이 되길 바랍니다!

언급URL : https://stackoverflow.com/questions/27637609/understanding-passport-serialize-deserialize

반응형