Passport OAuth Bearer OR是经过身份验证的

时间:2016-07-23 03:02:43

标签: javascript node.js authentication express passport.js

我一直在寻找这种情况是否有可能暂时没有找到任何东西。

基本上我使用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('/');
}

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

我正在考虑拥有多个中间件功能,因此它会调用isLoggedIn,然后调用controllerClient.isBearerAuthenticated。但似乎问题就是回调函数会被调用,所以它们都会被调用。我还在研究是否有一种方法可以跳过下一个中间件功能并转到下一个中​​间件,但我找不到任何相关内容。

我认为最好的办法是找出一种方法来跳过controllerClient.isBearerAuthenticated IF req.isAuthenticated() = true。现在可能有更好的方法来做到这一点,如果是这样,我很乐意听到它。

但有关如何使用中间件检查用户是否通过req.isAuthenticated() controllerClient.isBearerAuthenticated进行验证的建议?或者最好的方法是什么?

  

还有一个注意事项。之前我问过this问题,并发现passport.authenticate是为了处理实际问题   身份验证不是已经过身份验证的用户。   否则我只会将passport.authenticate与数组一起使用   护照策略。使用connect-ensure-login会遇到与使用connect-ensure-login或controllerClient.isBearerAuthenticated时相同的问题。

提前提前

1 个答案:

答案 0 :(得分:0)

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

基本上使用以下代码制作一个中间件函数似乎有效。

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消息,但希望能够深入研究这一消息。