gpt4 book ai didi

node.js - PassportJS - 在 Express 应用程序中使用多本 Passport

转载 作者:搜寻专家 更新时间:2023-10-31 22:22:47 24 4
gpt4 key购买 nike

假设我在一个快速应用程序中需要两本不同的 Passport (例如用户和房间)。所以我定义了两个单独的变量:

var passport    = require('passport');
var roomPassport = require('passport');

然后,我用单独的通行证策略初始化它们:

require('./config/passport')(passport); // pass passport for configuration
require('./config/roompassport')(roomPassport); // pass passport for configuration

最后一步是将它们设置为 Express 中间件:

// required for passport
application.use(session({ secret: 'ilovepassport;-)' })); // session secret
application.use(passport.initialize({ userProperty: "user" }));
application.use(passport.session()); // persistent login sessions
application.use(roomPassport.initialize({ userProperty: "room" }));
application.use(roomPassport.session()); // persistent login sessions
application.use(flash()); // use connect-flash for flash messages stored in session`

但是,如果我这样做,实际上 roomPassport 会覆盖 Passport ,而不是有两个对象 - req.user 和 req.room,我只有一个 req.room 但用用户数据初始化。

值得一提的是,每个通行证(用户或房间)都可以相互独立地进行身份验证,即存在对象 req.userreq.room必须存在。

如何解决?

编辑 1

好吧,又过了几个小时,虽然我必须分开 Passport 对象,但在 application.use(roomPassport.initialize({ userProperty: "room"})); 调用之后,事情变得一团糟 - 这是因为 req.login() 方法适用于最后附上的 Passport 。因此,它没有调用正确的 passport.serializeUser 方法,而是调用了 roomPassport.serializeUser 方法。

我的下一个问题 - 如何让 req.login() 调用正确的方法?

最佳答案

您遇到的问题是 Passport 模块会在您需要时导出实例化的 Passport 对象。并且因为该对象在您需要时由 Node 缓存,所以您每次都会得到完全相同的对象。

幸运的是, Passport 模块也给你一个 reference to the class ,这意味着您可以做到这一点。

var Passport = require('passport').Passport,
passport = new Passport(),
roomPassport = new Passport();

现在您应该有两个完全独立的 Passport 对象。

关于node.js - PassportJS - 在 Express 应用程序中使用多本 Passport ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25896753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com