Express.js:如何绕过Everyauth来处理特定路由?

4

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

为了初始化everyauth,我使用以下代码:

app.use(everyauth.middleware());

我想为特定路由绕过身份验证。 具体来说,我注意到findUserById在每个请求中都被调用,我想跳过某些路由(例如,/getImage无需身份验证)。
这是否可能?
2个回答

3

您可以手动包装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();
  }
});

这只是一个包装的中间件。

谢谢Tharabas。不幸的是,那个方法不起作用。它说auth()不是一个函数。我尝试直接调用everyauth.middleware(),但它没有调用next(),因此它无法处理任何请求。 - Lior Grossman

1
截至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方法的源代码在这里。我不确定app对象是如何使用的,但是masterexpress3分支的README都建议将其传递给everyauth.middleware方法。 - davb

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