没有*数据库会话的Passport令牌身份验证*

Ale*_*lls 13 node.js express jwt express-jwt passport.js

我正在寻找一种方法来使用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
//}));
Run Code Online (Sandbox Code Playgroud)

//app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)

那么使用Passport就足够了?

为什么有人会使用存储在数据库中的会话而不是使用基于JWT的身份验证?

Bor*_*rov 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
}));
Run Code Online (Sandbox Code Playgroud)

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