【问题标题】:Express.js: how to bypass Everyauth for certain routes?Express.js:如何绕过某些路由的 Everyauth?
【发布时间】:2012-03-05 05:07:02
【问题描述】:

我正在编写一个基于 Express.js 的应用程序,同时使用 Everyauth 进行身份验证。

为了初始化everyauth,我使用:

app.use(everyauth.middleware());

我想对某些路由绕过身份验证。 具体来说,我注意到每个请求都会调用 findUserById,我想在某些路由中跳过它(例如,对 /getImage 没有身份验证)。

这可能吗?

【问题讨论】:

    标签: node.js express everyauth


    【解决方案1】:

    您可以手动包装everyauth.middleware() 回调。

    var auth = everyauth.middleware();
    app.use(function(req, res, next) {
      if (shouldAuthRequest(req)) {
        // call auth, as if it was part of the route
        auth(req, res, next);
      } else {
        // ignore auth
        next();
      }
    });
    

    这不过是一个包装好的中间件。

    【讨论】:

    • 谢谢塔拉巴斯。不幸的是,这行不通。它说 auth() 不是一个函数。我尝试直接调用everyauth.middleware(),但它不调用next(),因此它不处理任何请求。
    【解决方案2】:

    从 0.4.5 开始,everyauth.middleware 必须使用 Express 的 app 对象调用。因此,您可以通过这种方式创建一个封装的中间件:

    var my_auth_middleware = function(app) {
      var auth = everyauth.middleware(app);
      // a custom middleware wrapping everyauth
      var middleware = function(req, res, next) {
        if (shouldAuthRequest(req)) {
          // go through the everyauth middleware
          auth(req, res, next);
        } else {
          // bypass everyauth
          next();
        }
      };
      // these allow the middleware to be "mounted" by Express
      middleware.set = true;
      middleware.handle = middleware;
      middleware.emit = auth.emit;
      // return our custom middleware
      return middleware;
    };
    

    然后将包装好的中间件添加到堆栈中

    app.use(my_auth_middleware(app));
    

    【讨论】:

    • kiddorails,我用的是everyauth的#express3分支,everyauth.middleware方法的来源是here。我不确定app 对象是如何使用的,但是masterexpress3 分支的两个自述文件都建议它应该传递给everyauth.middleware
    猜你喜欢
    • 2016-05-10
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多