我一直在寻找,看是否有可能一段时间,但没有发现任何东西。

基本上,我使用Passport来处理用户身份验证。当然可以使用Node.js和Express来处理服务器端的事情。我还使用oauth2orize允许OAuth和处理API调用。

对于API调用,我使用运行controllerClient.isBearerAuthenticated的中间件passport.authenticate('bearer', { session: false })。然后关闭并运行passport.use("bearer", new BearerStrategy)内部的函数。基本上检查令牌是否有效,然后调用回调函数。

对于非API请求和仅正常的网页,它运行以下中间件来检查身份验证。

function isLoggedIn(req, res, next) {
    if (req.isAuthenticated()) {
        return next();
    }
    res.redirect('/');
}


所以这是我的问题。如果有承载令牌或req.isAuthenticated() = true,我想允许访问我的API调用。当前,我必须选择是否要使用isLoggedIn中间件或controllerClient.isBearerAuthenticated中间件。我正在尝试找到一种将它们组合在一起的方法,例如or或声明或其他内容。

我正在考虑具有多个中间件功能,因此先调用isLoggedIn,再调用controllerClient.isBearerAuthenticated。但是似乎问题在于回调函数将被调用,因此它们都将被调用。我也在研究以确定是否有一种方法可以跳过下一个中间件功能并转到下一个中​​间件功能,但是我也找不到任何相关的东西。

我认为最好的选择是找出一种跳过controllerClient.isBearerAuthenticated IF req.isAuthenticated() = true的方法。现在可能会有更好的方法来执行此操作,如果可以,我很想听听。

但是有关如何使用中间件检查用户是否通过req.isAuthenticated()controllerClient.isBearerAuthenticated进行身份验证的任何建议?或实现此目标的最佳方法是什么?


  还有一点。我之前问过this问题,并发现passport.authenticate是为了处理实际
  身份验证而不是已经过身份验证的用户。
  否则,我只会将passport.authenticate与数组
  护照策略。使用connect-ensure-login会出现与我现在有关使用connect-ensure-login OR controllerClient.isBearerAuthenticated的问题相同的问题。


非常感谢!

最佳答案

我能够找出一个似乎有效的解决方案。为了将来参考以及可能遇到类似问题的人们,我将在下面发布我的解决方案。

基本上,使用以下代码来实现一个中间件功能似乎可行。

function isAuthenticated(req, res, next) {
    //Checking to see if user is authenticated on the web
    if (req.isAuthenticated()) {
        return next();
    }
    //If not checking to see if user is authenticated via Bearer and OAuth
    else {
        return controllerClient.isBearerAuthenticated.apply(this, arguments);
    }
}


因此,我们只是在检查req.isAuthenticated是否等于true。如果是这样,我们只是返回回调函数,就会调用API函数。如果没有,那么我们检查controllerClient.isBearerAuthenticated,它将成功自动调用下一个函数。如果不是,它将发送状态代码为401的Unauthorized

很好地弄清楚如何精确更改Unauthorized消息,但希望会对此进行深入研究。

10-08 09:41