복붙노트

[REDIS] 나는 직렬화를 구현하고 노드 JS + 여권 + RedisStore를 역 직렬화합니까?

REDIS

나는 직렬화를 구현하고 노드 JS + 여권 + RedisStore를 역 직렬화합니까?

나는 직렬화 및 역 직렬화를 구현합니까?

RedisStore 익스프레스 내 세션 저장소로 설정입니다. 나는 직렬화 및 역 직렬화를 구현하지 않는이 평균 않습니다? 자동 일어날 것인가?

나는이 방법을 구현하지 않을 때 나는 다음과 같은 익스프레스 오류 - 500 오류 : 세션에 직렬화 사용자에 실패했습니다. 내가 그들을 구현 할 때 나는 반드시 직렬화에 무엇을 넣어 아니에요.

이 나타납니다 아래의 코드가 작동 할 수 있지만, 세션이 지속되지 않습니다. 나는이 사이트를 방문 로그인 매번 할 필요가있다.

NodeJS + 여권 + RedisStore의 좋은 예를 들어, 어느 곳이 있습니까?

var sessionStore = new RedisStore({
                                        host: rtg.hostname,
                                        port: rtg.port,
                                        db: redisAuth[0],
                                        pass: redisAuth[1]
                                      });

passport.use(new ForceDotComStrategy({
    clientID: clientId,
    clientSecret: clientSecret,
    callbackURL: myurl
},
function(token, tokenSecret, profile, done) {
    console.log(profile);
    return done(null, profile);
  }
));

appSecure.configure('production', function(){
appSecure.use(allowCrossDomain);
appSecure.use(express.cookieParser(expressSecret));
appSecure.use(express.bodyParser());
appSecure.use(express.methodOverride());
appSecure.set('port', port); 
appSecure.use(express.session({ secret: expressSecret, store: sessionStore, key:'expressSid', cookie: { maxAge : 604800, domain:'.domain.com'}})); 
appSecure.use(passport.initialize());
appSecure.use(passport.session());
appSecure.use(appSecure.router);
appSecure.use(express.static(__dirname + '/public'));
appSecure.use(express.errorHandler());
});

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

passport.deserializeUser(function( user, done ) {
    done( null, user );
});

해결법

  1. ==============================

    1.당신이 세션을 사용하는 경우는 직렬화 및 역 직렬화 기능 여권을 제공해야합니다. 세션 저장소로 구현 레디 스 여권 구현 얼마나 함께 할 수 없다, 그것은 단지 세션 데이터가 저장되는 위치를 다루고있다.

    당신이 세션을 사용하는 경우는 직렬화 및 역 직렬화 기능 여권을 제공해야합니다. 세션 저장소로 구현 레디 스 여권 구현 얼마나 함께 할 수 없다, 그것은 단지 세션 데이터가 저장되는 위치를 다루고있다.

    내가 말한 것처럼, 직렬화 및 역 직렬화 기능은 작업에 세션에 여권을 제공해야합니다.

    직렬화 기능의 목적은 모든 후속 요청에 사용자 계정을 복구 할 수있는 충분한 식별 정보를 반환하는 것입니다. 구체적 일 () 메소드의 두번째 파라미터는 세션 데이터로 직렬화 된 정보이다.

    당신이 제공하는 직렬화 기능은 세션에 연재 된 식별 정보를 기반으로 사용자 프로필을 반환하기위한 것입니다.

    다음 섹션 토론 세션에서 여권 가이드의 예입니다 :

    passport.serializeUser(function(user, done) {
      done(null, user.id);
    });
    
    passport.deserializeUser(function(id, done) {
      User.findById(id, function(err, user) {
        done(err, user);
      });
    });
    

    상기 예시 passport.serializeUser ()에서 두 개의 매개 변수, 사용자 프로파일 (사용자) 및 콜백 함수 (완료)를 취하는 기능을 제공한다. 데이터베이스에서 계정을 복구하는 데 필요한이 두 번째 매개 변수가 식별 정보의로 콜백 함수는 소요 (user.id,하지만 당신은 MongoDB를를 사용하는 경우이 user._id 수 있음). 이것은 모든 인증 요청 저장 (즉, 쿠키 나 레디 스 매장에 있는지 여부를) 세션 데이터의 식별 정보에 호출됩니다.

    passport.deserializeUser ()는 또한 두 개의 매개 변수, 식별 정보 (ID)와 다시 콜백 함수 (완료)를 취하는 기능을 제공한다. 식별 정보는 이전의 요청 (user.id)에서 세션 데이터에 연재하는 것이다. 이 두 번째 매개 변수, 또는 처음으로 파라미터의 프로파일을 검색에서 발생하는 임의의 에러로 콜백 함수는 현재 사용자 프로파일을 필요로한다. User.findById () 함수는 데이터베이스의 사용자 프로파일에 대한 조회 함수이다. 이 예에서 사용자 오브젝트의 findById 메소드 () 함수를 갖는 몽구스 모델의 인스턴스이다.

    passport.deserializeUser ()에 제공되는 기능은 여권 미들웨어에 의해 호출된다 passport.session () req.user에 사용자 프로파일 (사용자)를 저장하는 처리 경로에 앞서.

    레디 스를 사용하는 목적은 클라이언트 측에만 저장된 데이터 세션 ID하므로 세션 데이터를 서버 측에 저장하는 것이다. 다시 말하지만, 이것은 당신이 여권을 구현하는 방법에 독립적이다, 여권 세션 데이터가 한 앱에 세션 지원을 추가로 저장되는 위치 상관하지 않습니다. 이 previos 방법 레디 스를 구현하는 유래 주소에 질문

  2. ==============================

    2.비트 늦게하지만 난 이해하는이 시각적 인 일을 만들었다

    비트 늦게하지만 난 이해하는이 시각적 인 일을 만들었다

    passport.authenticate은 () 인수로 제공하는 각각의 전략을 호출, 당신은 저장된 데이터베이스 또는 메모리 저장 암호와 사용자 이름을 req.body.password 및 req.body.username이 일치합니다. 사용자가 알게되면 당신은) (완료 다른 두 번째 인수로는 false를 반환에 전달

    완료 콜백 반환 다시는 passport.authenticate합니다 (). 이전에 사용자 (즉 수행 (널 (null), 사용자))를 호출하는 경우에 REQ보다 로그인 ()는 자동 또는 장면 뒤에 사용자에 의해 호출된다

    req.logIn는 () () passport.serializeUser를 호출

    당신이 직렬화 함수의 완료의 두 번째 인수에서 제공하는 사용자 개체의 키를 세션에 저장 및 역 직렬화 기능을 통해 전체 개체를 검색하는 데 사용됩니다.

    직렬화 기능은 세션에 저장되어야하는 사용자 개체에서 데이터를 결정. serializeUser 방법의 결과 req.session.passport.user = (우리는 같은 키 ID를 제공하기 때문에) 여기서, 예를 들어 그것이있을 것이다} = {req.session.passport.user 같은 세션에 부착 {ID 「XYZ ' }

    직렬화 함수에서 당신이 역 직렬화 함수의 첫 번째 인수에 제공 직렬화 통화에서 수행 기능에 주어진 사용자 개체의 동일한 키가. 그래서 당신의 전체 개체는 해당 키의 도움으로 검색됩니다. 여기에 키 ID가입니다 (키는 이메일 등 사용자 개체 즉, 이름의 열쇠가 될 수 있습니다) 직렬화 함수에서 키는 메모리 어레이 / 데이터베이스 또는 데이터 자원에 일치되어 있는지

    페치 개체 req.user 같이 요청 개체에 부착되고

    ID 키는 사용자 개체 즉 이름의 열쇠가 될 수 있으며, 이메일 등

    비주얼 흐름

    passport.authenticate()-----------
                                     |  
                                     |  invokes 
                                    \./
           passport.use(new LocalStrategy(
                function(username, password, done) {
    
               // match req.body.username and req.body.password from any 
                  //data base or in memory array
                   if(user_is_found_and_pass_match)
                      done(null,user);--
                   else                   | *1-user passed
                                          |
                      done(null,false);---| *2-user not passed
           });                            | 
                                          |return back to
    passport.authenticate() <------------ |
                          |
                          |----- if user is passed in done() (*1) ,   
                                |
        req.login()   <--------- 
                  |
     //authenticate() middleware  may  invoke req.login() automatically.
                  |
                  | calls
                 \./  
     passport.serializeUser(function(user, done) {
            done(null, user.id); 
                         |
    //use 'id'to serialize, you can use other or user object itself
        });              |-->saved to session req.session.passport.user = {id:'..'}
                         |
                         |__________________
                                           |          
        passport.deserializeUser(function(id, done) {
                          ________________|
                          | 
            User.findById(id, function(err, user) {
                done(err, user);
                           |______________>user object ataches to the request as req.user
    
         });
          });
    

    여기에 ID 키는 사용자 개체 즉 이름의 키가 될 수 있습니다, 이메일 등

  3. ==============================

    3.세션 저장소 (익스프레스 4를 사용)로 연결 - 레디 스에 명시 세션의 다음과 같은 구성을 감안할 때 :

    세션 저장소 (익스프레스 4를 사용)로 연결 - 레디 스에 명시 세션의 다음과 같은 구성을 감안할 때 :

    redis = require('redis').createClient(6379, '127.0.0.1');
    session = require('express-session');
    RedisStore = require('connect-redis')(session);
    
    app.use(session({
      store: new RedisStore({
        client: redis
      }),
      secret: 's3cret',
      resave: true,
      saveUninitialized: true
    }));
    

    당신은 대신 사용자 ID의 전체 사용자 개체를 직렬화 여권을 알 수 있습니다.

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

    전체 사용자 개체는 레디 스에서 세션으로 저장, 모든 요청에 ​​대해 req.user와 같은 요청에 배치됩니다.

  4. from https://stackoverflow.com/questions/19268812/do-i-implement-serialize-and-deserialize-nodesjs-passport-redisstore by cc-by-sa and MIT license