Node.js 和 Express 排除路由表单 JWT 中间件

Posted

技术标签:

【中文标题】Node.js 和 Express 排除路由表单 JWT 中间件【英文标题】:Node.js and Express Exclude route form JWT middleware 【发布时间】:2018-10-02 07:19:54 【问题描述】:

我正在尝试排除特定路由的 JWT 身份验证。我能够成功地将它排除在某些路线上,但不能排除在其他路线上。我在下面发布代码。

我不需要验证进入下面提到的路线,它工作正常。

app.post('/api/register*', function(request,response, next)
    console.log("Entered register/user function");
    registerProxy(request, response, next);
);

我需要验证才能进入下面提到的路线,它工作正常。

app.get('/api/users*', protected, function(request, response, next)
    console.log('Entered userinfo function');
    userInformationProxy(request,response,next);
);

以下是我的“受保护”功能

function protected(request, response, next) 
    console.log('Entered function to strip jwt');
    console.log(request.method, request.url);
    const bearerHeader = request.headers['authorization'];
    if(typeof bearerHeader !== 'undefined')
        console.log('JWT is present');
        const bearer = bearerHeader.split(' ');
        const bearerToken = bearer[1];
        request.token = bearerToken;
        jwt.verify(request.token, secretKey, function(error, authData)
            if(error)
                response
                    .status(403)
                    .json('message': 'Forbidden')
             else
                console.log(authData);
                if(request.url.includes(authData.username))
                    next();
                 else
                    response
                        .status(403)
                        .json('message': 'Forbidden')
                
            
        );
     else 
        response
            .status(403)
            .json('message': 'Forbidden')
    ;

但是当我尝试进入下面提到的路线时遇到了问题:

app.get('/api/search', function(request, response, next)
    console.log('Entered search function');
    searchProxy(request, response,next);
);

虽然我没有使用“受保护”功能保护这条路线,但它给了我一个错误 403 禁止

我做错了吗?我是 Node.js 和 JWT 的新手

【问题讨论】:

【参考方案1】:

只要确保这个路由定义:

app.get('/api/search', function(request, response, next)
    console.log('Entered search function');
    searchProxy(request, response,next);
);

在这个之前:

app.get('/api/users*', protected, function(request, response, next)
    console.log('Entered userinfo function');
    userInformationProxy(request,response,next);
);

并且,您从searchProxy() 发送回复,并且不要致电next()。如果您发送响应但不调用next(),则不会运行更多路由,因此无法到达您的protected() 中间件。

【讨论】:

路由定义的顺序没问题。问题是因为我在做 next() 错误吗? @Akshay - 当您希望路由继续到其他路由时,您应该只调用next()。如果您已发送响应并且不想再运行任何路由,请不要致电next() - 您已经完成了。 next() 的目的是查看是否有任何其他路由(在此之后定义)将匹配并可以运行。在您的情况下,当您进入/api/search 的路由处理程序时,您不希望任何其他路由在它之后运行。您已经处理了请求并完成了。 明白你的意思,我更正了代码。但是,当我输入 /api/search 时,我仍然得到“403” @Akshay - 然后向我们展示searchProxy() 的代码,因为这显然是问题所在。 @Akshay - 如果这是searchProxy() 的全部代码,那么您会从中获得 403,或者在您到达此处之前链中还有其他一些中间件导致 403 或那个当你不想要它时,函数正在调用next()。因为您没有向我们展示一组有凝聚力的代码,所以我们所能做的就是猜测。

以上是关于Node.js 和 Express 排除路由表单 JWT 中间件的主要内容,如果未能解决你的问题,请参考以下文章

Node.js Express POST 仅更改了路由器的输入

如何使用 Express 和 Node.js 从表单发送参数

Node.js Express 路由命名和排序:优先级如何确定?

node.JS Express 护照路由

Express 路由丨Node.js-初识 Express

typescript node.js express 路由分隔文件的最佳实践