节点客户端会话与快速会话

Posted

技术标签:

【中文标题】节点客户端会话与快速会话【英文标题】:Node-Client-sessions vs express-session 【发布时间】:2015-12-28 19:04:23 【问题描述】:

我有这个作为后端 OAuth 服务器前端的 Node API。在 SAML OAuth 舞蹈结束时,我在浏览器 cookie 中设置了不记名令牌。

// need cookieParser middleware before we can do anything with cookies
app.use(express.cookieParser());

// set a cookie
app.use(function (req, res, next) 
  // check if client sent cookie
  var cookie = req.cookies.cookieName;
  if (cookie === undefined)
  
    // no: set a new cookie
    var randomNumber=Math.random().toString();
    randomNumber=randomNumber.substring(2,randomNumber.length);
    res.cookie('cookieName',randomNumber,  maxAge: 900000, httpOnly: true );
    console.log('cookie created successfully');
   
  else
  
    // yes, cookie was already present 
    console.log('cookie exists', cookie);
   
  next(); 
);


app.use(express.static(__dirname + '/public'));

现在我被介绍给一个花哨的 NPM,它做几乎相同的事情 https://github.com/mozilla/node-client-sessions

当我几乎倾向于使用这个 NPM 时,我遇到了 express-session。 https://github.com/expressjs/session - 这是用于服务器端会话。但这也设置了一个 cookie

    var express = require('express');
    var session = require("express-session");
    var app = express();


    app.use(session(
        resave: true,
        saveUninitialized: true,
        secret: 'ABC123',
        cookie: 
            maxAge: 60000
        
    ));


    app.get("/test", function(req, res) 
        req.session.user_agent = req.headers['user-agent'];
        res.send("session set");
    );

如果我只需要在浏览器 cookie 中为后续 API 调用设置不记名令牌,我应该选择哪个选项?

【问题讨论】:

【参考方案1】:

express-session 是我的目标。

如果你看看用两种不同的方法完成同一件事需要什么,我认为答案很明确。

如果您只想设置一个客户端 cookie,使服务器能够正确验证未来的请求,那么 express-session 非常棒。

这是来自another question I answered 的示例集,它使用 MongoDB 作为后端来存储您的会话:

'use strict';

var express = require('express'),
  session = require('express-session'),
  cookieParser = require('cookie-parser'),
  mongoStore = require('connect-mongo')(session),
  mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/someDB');

var app = express();

var secret = 'shhh';

app.use(session(
  resave: true,
  saveUninitialized: true,
  secret: secret,
  store: new mongoStore(
    mongooseConnection: mongoose.connection,
    collection: 'sessions' // default
  )
));

// ROUTES, ETC.

var port = 3000;

app.listen(port, function() 
  console.log('listening on port ' + port + '.')
);

【讨论】:

并且会话将在每个后续 API 调用中自动匹配?获取类似的帖子? 是的,完全正确。在收到请求时,express-session 会查找connect.sid cookie,然后将会话附加到req.session。注意session 是如何在app.use(...) 内部定义的。 Session 充当中间件。

以上是关于节点客户端会话与快速会话的主要内容,如果未能解决你的问题,请参考以下文章

Zookeeper

节点 SSH2 客户端连接会话

四种类型的数据节点 Znode ?

分布式Zookeeper会话

关于Zookeeper

zookeeper-四种类型的数据节点 Znode