护照令牌authentication*无*数据库会话

我正在寻找一种方法来使用Passport.js的Twitter策略,而不使用数据库中的会话集合/表。 原因是我们将会话集合中的所有数据都保存得很大,每当用户发出请求时我们都会保存数据库往返,因为我们不必每次都去DB去获取会话数据。

无论如何,我们应该能够使用令牌(JSON Web令牌)来validation用户,这篇文章如何描述:

https://scotch.io/tutorials/authenticate-a-node-js-api-with-json-web-tokens

但是我很困惑,为什么没有一个简单的方法来做这个护照? (这篇文章没有护照什么都可以做 – 但是Passport已经包括了这个?)。

也许我正在推翻这一点,而这样做只是为了省略我在Express中使用DB会话的呼叫,然后Passport已经足够聪明来处理JWT了? 不知何故,我怀疑这一点。

例如,在我的Express服务器中注释掉这些代码当然是不够的。

//app.use(expressSession({ // secret: 'arrete_x_paulette', // store: new MongoStore({mongooseConnection: mongoose.connection}), // saveUninitialized: true, // resave: true, // cookie: { // secure: false, // maxage: 6000000 // }, // proxy: false //})); 

 //app.use(passport.session()); 

那么使用护照就足够了?

为什么有人会使用基于JWT的身份validation来使用存储在数据库中的会话?

更新:更好的解决scheme是根本禁用会话。

我认为通过将{ session: false }传递给passport.authenticate应该可以工作,请参阅文档 ,从而删除会话中间件,并将其禁用为passport。

这个想法是会话数据存储在令牌中,所以根本不需要会话。 将其存储在内存中(如下所述)只会浪费内存。 存储在客户端的cookie也不好,因为客户端应该决定在哪里存储令牌而不是服务器。


如果您只是想在内存中保留express.js会话,并且如果您使用标准expressjs的会话来处理会话,则只需要删除该store: new MongoStore(...)行:

 app.use(expressSession({ secret: 'arrete_x_paulette', saveUninitialized: true, resave: true, cookie: { secure: false, maxage: 6000000 }, proxy: false })); 

默认情况下,它使用MemoryStore ,请参阅文档 。

@Boris Serebrov的答案大多是正确的。 您可能需要设置{session:false},以便会话不会存储在服务器本身的内存中,也不会将会话保存在数据库中。 但是这个故事可能还有一点点。

人们使用持久性内存存储的原因之一是因为这意味着如果服务器重新启动,会话不会丢失。 但是,我们已经承诺基于无状态JWT令牌的身份validation。 所以如果它是无状态的,为什么服务器重新启动会有影响? 一旦服务器恢复运行,不pipe服务器的状态如何,相同的标记应该是有效的,对吗?

在我的简短介绍中,我发现expressSession将提供在服务器重新启动时会丢失的会话。 这可能促使人们首先使用Mongo和Redis进行持续会话! 但是你不需要这样做! 我没有看到任何理由使用存储在数据库中的持久会话。 你应该使用JWT和无状态authentication…所以替代似乎是cookieSession,Express的另一个模块。

如果你这样使用cookieSession:

 app.use(cookieSession({ name: 'some-cookie', keys: ['key1', 'key2'] })); 

那么即使服务器重新启动,“会话”仍然存在。 只要您移除了在MongoStore中存储会话的呼叫,此function就可以与您当前的Passportconfiguration一起使用

https://github.com/expressjs/cookie-session

请纠正我,如果我错了或俯视的东西。