PassportJS - 在 Express 应用程序中使用多本护照

问题描述 投票:0回答:2

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

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.user
req.room
都必须存在。

如何解决这个问题?

编辑1

好吧,又过了几个小时,似乎虽然我必须分离护照对象,但在调用

application.use(roomPassport.initialize({ userProperty: "room" }));
后,事情变得混乱 - 这是因为
req.login()
方法适用于最后附加的护照。因此,它没有调用正确的
passport.serializeUser
方法,而是调用
roomPassport.serializeUser
方法。

我的下一个问题 - 如何让

req.login()
调用正确的方法?

node.js express passport.js
2个回答
12
投票

您遇到的问题是,护照模块会在您需要时导出实例化的 Passport 对象。而且由于该对象在您需要时由节点缓存,因此您每次都会获得完全相同的对象。

幸运的是,护照模块还为您提供了对课程的参考,这意味着您可以执行此操作。

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

现在你应该有两个完全独立的护照对象。


0
投票

对于打字稿,您可以直接导入类

import { Passport } from 'passport'

const passport = new Passport()

我也尝试在这里写出完整的步骤: https://zenn.dev/theblindhawk/articles/0a5b39114b7f51

© www.soinside.com 2019 - 2024. All rights reserved.