PassportJS - 如何制作单独的passport.session

时间:2014-09-17 19:18:51

标签: cookies express passport.js

我的问题与PassportJS - Using multiple passports within Express application主题有关。 因此,只要我已经有两个单独的护照实例,我意识到它们都共享相同的cookie,在此处创建:

application.use(session({ secret: 'my secret cookie', key: 'usid' }));

我可以使用以下方法添加一个不同名称的cookie:

app.use(connect.session({ secret: 'keyboard cat', key: 'rsid' }))

但是,我不清楚如何指示每张护照使用自己的cookie。

2 个答案:

答案 0 :(得分:0)

我通过以下途径找到了0.4.0护照的临时解决方案

passport._key = passport._sm._key = 'customPassportSessionKey'

答案 1 :(得分:0)

您可以通过从路由器而不是从应用程序生成来解决此问题。我通过开发类似AuthBuilder的方法解决了相同的问题,该方法可以接收某些参数,每个实例都以此方式生成新的通行证。

class AuthBuilderService {
    constructor() {
        this.passport = new Passport();
        this.registerSerializers(); // Multiple serializers
        this.registerStrategies(); // Multiple strategies
    }

然后,您可以通过调用authbuilder.addRouter(...)

使用相同的护照和密钥(或仅一个)注册多个路由器。
 addRouter(router, loginFileName, failureUrl, successUrl) {
        router.use('/login', express.static(`${__dirname}/../views/whatever`, {
            index: loginFileName,
            fallthrough: true,
        }));

        router.use(session({
            secret: 'any secret',
            key: (_isRouterA()) ? 'a' : 'b',
            resave: true,
            saveUninitialized: true
        }));

        router.use(this.passport.initialize());
        router.use(this.passport.session());

        this._configureRouter(router, failureUrl, successUrl); // There I'm handling login, logout and some middleware.

        return this;
    }

从您要保护的路由器:

    routerUsers_1.get('something_1', method)
    routerUsers_2.get('something_2', method2)
    let authBuilder = new AuthBuilderService();    
    authBuilder.addRouter(routerUsers_1, 'login_users_vip.html', '/path/failure_vip/', '/path/success_vip');
    authBuilder.addRouter(routerUsers_2, 'login_users.html', '/path/failure/', '/path/success');


    routerAdmins.get('something', methodAdmin)
    new AuthBuilderService().addRouter(routerAdmins, 'login_admins.html', '/path2/failure/', '/path2/success');

然后快递应用程序仅使用每个路由器。

app.use('path-client-vip', routerUsers_1)
app.use('path-client', routerUsers_2)
app.use('path-admin', routerAdmin)

我正在同一台Express应用服务器中使用2个Web应用程序(具有不同的用户,登录名和内容),每个Web应用程序针对多个路由器使用此AuthBuilderService的不同实例,并在每个AuthBuilderService实例之间使用不同的通行证,会话,策略和序列化程序

希望它会对别人有帮助。