【问题标题】:Why req.session saved in sessionStore and How to access value from sessionStore为什么 req.session 保存在 sessionStore 中以及如何从 sessionStore 访问值
【发布时间】:2014-06-19 06:03:21
【问题描述】:

我在 node.js 中使用 express + passport.js。 并希望保护我的 RestAPI。我已将会话中的令牌设置为:

saveUser = function (req, res) {  
User.findOrCreate({ user_id: req.body.user_id, user_name: req.body.username })
     .success(function(result){
       req.session.token = 'dfgsfd4g564fg456d4gsgsdfg4';
       res.send({status:"ok"});
     }).error(function(error){
         res.send(error);
     }); };

但是这是在 req.sessionStore.sessions 中设置的,为什么。? 并且每次更改密钥时,如何从 req.sessionStore.sessions 访问令牌?

 sessionStore: 
   { sessions: { E8DRcn3lWkTfAJb3FsPnoeaF: '{"cookie":{"originalMaxAge":null,"expires":null,"secure":true,"httpOnly":true,"path":"/"},"passport":{},"username":"testing.user","token":"3iqZ31YdUaTtyvI6"}' },
     generate: [Function],
     _events: { disconnect: [Function], connect: [Function] } },
  sessionID: 'Ykl9ONPvbxsTOa9Fonb6GFEP',
  session: 
   { cookie: 
      { path: '/',
        _expires: null,
        originalMaxAge: null,
        httpOnly: true,
        secure: true },
     passport: {} },

我的 app.js 文件中的这个配置。

app.configure (function () {
  app.use (express.cookieParser()); 
  app.use (express.bodyParser ());
  app.use (express.methodOverride ());
  app.use (express.session({ secret: 'secret_code' })); // session secret
  app.use (flash());
  app.use (express.json());
  app.use (passport.initialize());
  app.use (passport.session());
  app.use (express.static(path.join(__dirname, 'public')));
  app.set ('view engine', 'ejs');
  app.use (app.router);
});

提前致谢。

【问题讨论】:

    标签: node.js express session-cookies


    【解决方案1】:

    您不应该与 sessionStore 交互,您始终可以在 req.session 中的每个会话级别访问您的会话。

    所以,要设置一个令牌,你做对了:

    req.session.token = 'some token';
    

    并在后续请求中访问它,即。在身份验证中间件中,您将检查 req.session.token ,如下所示:

    function someMiddleware(req, res, next) {
        if(req.session && req.session.token) {
            User.validateToken(req.session.token, function(err, valid){
                if(!err && valid) {
                    next();
                } else {
                    next(new Error('Token not valid.'));
                }
            }); // or something like that
         } else {
            next(new Error('No session token');
         }
    };
    

    我不确定,但我认为即使是护照的策略也可以做到这一点。

    【讨论】:

    • 嗨@Ziatko,感谢您的快速回复。你是对的。我以同样的方式实施。但我没有在 req.session 或 req.session.token 中获得价值。
    • 您可能还想关心中间件是如何设置的。 session() 中间件是否放在护照中间件之前?你包括了passport.session吗?也许将您的 app.js/server.js/whatever main 文件添加到问题中?
    • 是的@Ziatko。我还在 express.session 之后包含了 passport.session。我已使用最新的应用配置更新了我的问题。
    猜你喜欢
    • 2016-01-05
    • 2018-06-10
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    相关资源
    最近更新 更多