13

我正在寻找一种在不使用数据库中的会话集合/表的情况下对 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 的身份验证?

4

2 回答 2

5

更新:更好的解决方案是完全禁用会话。

我认为删除会话中间件以进行 express 并通过传递{ session: false }passport.authenticate应该工作来禁用它的护照,请参阅文档

这个想法是会话数据存储在令牌内,因此您根本不需要会话。将其存储在内存中(如下所述)只会浪费内存。将它存储在客户端的 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,请参阅文档

于 2016-01-22T21:14:21.490 回答
3

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

人们使用持久内存存储的原因之一是因为这意味着如果服务器重新启动,会话不会丢失。但是,我们已经承诺基于 JWT 令牌的无状态身份验证。因此,如果它是无状态的,那么服务器重新启动又有什么关系呢?一旦服务器重新启动并运行,无论服务器的状态如何,相同的令牌都应该是有效的,对吧?

我发现,在我的简短尝试中,expressSession 将提供如果服务器重新启动将丢失的会话。这可能促使人们首先使用 Mongo 和 Redis 使用持久会话!但你不需要这样做!我看不出有任何理由使用存储在数据库中的持久会话。您应该使用 JWT 和无状态身份验证......所以替代方案似乎是 cookieSession,Express 的另一个模块。

如果你像这样使用 cookieSession:

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

那么即使您的服务器重新启动,“会话”仍然存在。这适用于您当前的 Passport 配置,只要您删除对 MongoStore 中存储会话的调用等。

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

如果我错了或忽略了什么,请纠正我。

于 2016-01-23T01:41:48.360 回答