Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Express中的会话管理_Express_Passport.js_Express Session - Fatal编程技术网

Express中的会话管理

Express中的会话管理,express,passport.js,express-session,Express,Passport.js,Express Session,我有一个express应用程序,其中包含express session、session file store和passport。当用户首次登录时,服务器会创建一个sessionID,并创建相应的会话文件。但是,我有以下问题: 当User Agent或curl使用connect.sid发送cookie时,我无法在会话存储中查找保存的ID。我查看了会话文件存储文档,找不到任何方法或方法。有办法吗 是否有办法在“注销”请求时销毁或删除会话 编辑 正如@jfriend00所建议的,我认为最好提供更多的上

我有一个
express
应用程序,其中包含
express session
session file store
passport
。当用户首次登录时,服务器会创建一个
sessionID
,并创建相应的会话文件。但是,我有以下问题:

  • User Agent
    curl
    使用
    connect.sid
    发送
    cookie
    时,我无法在会话存储中查找保存的ID。我查看了
    会话文件存储
    文档,找不到任何方法或方法。有办法吗
  • 是否有办法在“注销”请求时销毁或删除会话
  • 编辑 正如@jfriend00所建议的,我认为最好提供更多的上下文。如前所述,我有大约3个用于会话的中间件。这是它们的安装方式:

    authserver.js

    // session options
    const sessOpts = {
      genid: (req) => uuid(),
      store: new sessionFS(),
      secret: _secret,
      resave: false,
      saveUninitialized: true
    };
    // mws
    authservice.use(initLogger); 
    authservice.use(exprSession(sessOpts));
    authservice.use(bodyParser.json());
    authservice.use(bodyParser.urlencoded({ extended: false }));
    authservice.use(expSanitizer()) // must follow preceeding line
    authservice.use(corsHandler);
    authservice.disable('x-powered-by');
    authservice.disable('etag');
    // session mws
    authservice.use(passportInst.initialize());
    authservice.use(passportInst.session());
    
    passport.use(new passportLocal(
    (username, password, done) => {
        //console.log('In local');
        mongoHelpers.connect((cerr, db) => {
            if(!!cerr) return done(cerr);
            mongoHelpers.findUser({
                username: username,
                password: password
            }, db, (err, usrs) => {
                if(!!err) return done(err);
                if(!!!usrs) return done(null, false);
                //if(!validateUser(usrs[0], userSchema)) return done(null, false);
                //console.log('local: ' + usrs.toString());
                //console.log(usrs);
                return done(null, usrs[0]);
            });
        });
    }
    ));
    passport.serializeUser((user, done) => {
       console.log('In serializer');
       if(!!!user) {
         done(new Error("User cant be undefined in serializeUser"), null);
        //console.log("user is null");
       }
       done(null, user._id); // mongo auto id
    });
    passport.deserializeUser((id, done) => {
     console.log('In Dcserializer');
     console.log(id);
    
    });
    
    以下是设置
    passport LocalStrategy
    的方法:

    passport\u strategies.js

    // session options
    const sessOpts = {
      genid: (req) => uuid(),
      store: new sessionFS(),
      secret: _secret,
      resave: false,
      saveUninitialized: true
    };
    // mws
    authservice.use(initLogger); 
    authservice.use(exprSession(sessOpts));
    authservice.use(bodyParser.json());
    authservice.use(bodyParser.urlencoded({ extended: false }));
    authservice.use(expSanitizer()) // must follow preceeding line
    authservice.use(corsHandler);
    authservice.disable('x-powered-by');
    authservice.disable('etag');
    // session mws
    authservice.use(passportInst.initialize());
    authservice.use(passportInst.session());
    
    passport.use(new passportLocal(
    (username, password, done) => {
        //console.log('In local');
        mongoHelpers.connect((cerr, db) => {
            if(!!cerr) return done(cerr);
            mongoHelpers.findUser({
                username: username,
                password: password
            }, db, (err, usrs) => {
                if(!!err) return done(err);
                if(!!!usrs) return done(null, false);
                //if(!validateUser(usrs[0], userSchema)) return done(null, false);
                //console.log('local: ' + usrs.toString());
                //console.log(usrs);
                return done(null, usrs[0]);
            });
        });
    }
    ));
    passport.serializeUser((user, done) => {
       console.log('In serializer');
       if(!!!user) {
         done(new Error("User cant be undefined in serializeUser"), null);
        //console.log("user is null");
       }
       done(null, user._id); // mongo auto id
    });
    passport.deserializeUser((id, done) => {
     console.log('In Dcserializer');
     console.log(id);
    
    });
    
  • 现在有两个会话
    exprSession
    ,它是
    expresssession
    passport.session()
    的一个实例。这两个实例引用的是同一个对象吗
  • 我正在查找每个身份验证策略的
    user
    集合,以查找匹配的密码对或用户名和密码。这种查找也在链的另一个中间件中完成。第二个中间件是多余的吗|
  • 在serialize user方法中,我传递mongo id。在反序列化中,我将会话id作为
    id
    返回。如果这是会话ID,是否有方法使用它来销毁会话
  • 当用户注销时,即使设置了
    maxAge
    expires
    也可以删除/取消设置以前设置的cookie,这是一种好的做法吗(或者甚至是一般做法)

  • 如果这个问题有点复杂,我很抱歉。我对这些中间件相当陌生。

    使用
    快速会话
    ,如果您登录并且有会话,您可以调用
    req.session.destroy()
    。为此,您不需要自己查找会话,express session中间件会为您这样做,并将会话置于
    req.session
    中,您可以在其中访问它(如果使用会话登录)。@jfriend00我确实有另一个问题,使用查找功能(我想)更容易解决。正如我提到的,我使用的是passportjs,在
    passport.deserializeUser((id,done)=>{//id是什么,如果这是会话id,如何查找和删除它?})
    。我希望它能解释。然后,请为该问题写一个新问题或编辑您的问题,使其成为您的特定问题。passport和express session被广泛使用,所以只要我们知道您的实际根本问题是什么,您的任何问题都可能已经在某个地方讨论过了。@jfriend00编辑了原始帖子。