使用Everyauth/Express和多种配置?

4
我成功地使用了Node.js + Express + Everyauth(https://github.com/abelmartin/Express-And-Everyauth/blob/master/app.js)来让我的应用程序从Facebook、Twitter等登录。但是,我遇到的问题是Everyauth似乎是“配置并忘记”的。我设置了一个单独的everyauth对象,并将其配置为express的中间件,然后就忘记了它。例如,如果我想创建一个移动版的Facebook登录,我会这样做:
var app = express.createServer();
everyauth.facebook
      .appId('AAAA')
      .appSecret('BBBB')
      .entryPath('/login/facebook')
      .callbackPath('/callback/facebook')
      .mobile(true);     // mobile!
app.use(everyauth.middleware());
everyauth.helpExpress(app);
app.listen(8000);

以下是翻译的结果:
问题如下: 移动和非移动客户端都将连接到我的服务器,直到连接建立之前我不知道哪一个正在连接。更糟糕的是,我需要支持多个Facebook应用程序ID(同样地,我在客户端连接并部分解析输入之前不知道我将要使用哪个)。因为everyauth是一个单例,只能配置一次,我无法基于所做的请求来看如何进行这些配置更改。
似乎我需要创建一些中间件,在everyauth中间件之前就对其进行配置,以便随后的everyauth使用正确的appId/appSecret/mobile参数。但我不知道该如何实现这一点...
有什么建议吗?
以下是我目前最好的想法,尽管它看起来很糟糕: 为每种可能的配置创建一个everyauth对象,使用不同的entryPath来区分...
1个回答

0

显然我在喝上午咖啡之前就急于行动,因为我回答了自己的问题,并且实现起来非常容易。基本上,我只需要创建自己的自定义express中间件,在everyauth获取请求之前切换everyauth配置即可。

var configureEveryauth = function()
{
    return function configure(req, res, next) {
        // make some changes to the everyauth object as needed....          
        next();
    };
}

现在我的设置变成了:

var app = express.createServer();
everyauth.facebook
  .entryPath('/login/facebook')
  .callbackPath('/callback/facebook');
app.use(configureEveryauth());
app.use(everyauth.middleware());
everyauth.helpExpress(app);
app.listen(8000);

注意,我甚至不会在启动期间完全配置everyauth Facebook对象,因为我知道中间件会填充缺失的参数。

如何将所有 everyauth 代码放到另一个文件中并在我们的中间件中引用?app.use(function (req, res, next) { require('./auth/facebook').init(req, res, next); });Facebook 文件将包含与 everyauth 相关的所有内容,例如 findOrCreateUserreturn promise 等等... - Justin John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接