我正在寻找一种方法来使用Passport.js的Twitter策略,而无需在数据库中使用会话集合/表。 这样做的原因是我们将会话集合中的所有数据保存得非常大,并且每当用户发出请求时我们都会保存数据库往返,因为我们不必每次都去数据库获取会话数据。
无论如何,我们应该能够使用令牌(JSON Web令牌)来验证用户,这篇伟大的文章描述了这一点:
https://scotch.io/tutorials/authenticate-a-node-js-api-with-json-web-tokens
但是我很困惑为什么用Passport做一个简单的方法呢? (文章在没有Passport的情况下完成所有工作 - 但是Passport肯定会覆盖这个吗?)。
也许我在思考这个问题,而这样做的方法就是省略我在Express中使用数据库会话的调用,然后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());
那么使用Passport就足够了吗?
为什么有人会使用存储在数据库中的会话而不是使用基于JWT的身份验证?
答案 0 :(得分:5)
更新:更好的解决方案是根本禁用会话。
我认为通过将{ session: false }
传递给passport.authenticate
来删除会话中间件以进行快速处理并将其禁用,这应该有效,请参阅docs。
我们的想法是会话数据存储在令牌中,因此您根本不需要会话。 将其存储在内存中(如下所述)只会浪费内存。将它存储在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
,请参阅documentation。
答案 1 :(得分:2)
@Boris Serebrov答案大多是正确的。您可能希望设置{session:false},以便会话不会存储在服务器本身的内存中,同时不会在数据库中保存会话。但这个故事可能还有一点。
人们使用持久性内存存储的原因之一是因为这意味着如果服务器重新启动,会话就不会丢失。但是,我们已经承诺基于无状态JWT令牌的auth。因此,如果它是无状态的,为什么服务器重启会有关系呢?一旦服务器备份并运行,无论服务器的状态如何,相同的令牌都应该是有效的,对吗?
我发现,在我的短暂尝试中,如果服务器重新启动,expressSession将提供将丢失的会话。这可能促使人们首先使用Mongo和Redis来使用持久会话!但是你不需要这样做!我没有看到任何理由使用存储在DB中的持久会话。你应该使用JWT和无状态auth ...所以替代似乎是cookieSession,Express的另一个模块。
如果你像这样使用cookieSession:
app.use(cookieSession({
name: 'some-cookie',
keys: ['key1', 'key2']
}));
然后,即使服务器重新启动,“会话”也是如此。遗迹。这适用于您当前的Passport配置,只要您在MongoStore中删除对存储会话的调用等。
https://github.com/expressjs/cookie-session
如果我错了或忽略某些事情,请纠正我。