Node.js 使用expressjs阅读正文前检查授权

Node.js 使用expressjs阅读正文前检查授权,node.js,http,express,sails.js,Node.js,Http,Express,Sails.js,我有一个使用sailsjs开发的web服务器,它充当身份验证API。基本上,对于每个请求,它: -获取授权标头中的承载令牌 -获取传入的url 并检查请求的用户是否拥有此特定资源的权限 我希望能够在收到请求主体(可能是几GB的文件)之前执行此检查,并且在授权确定后,将这些文件发送到另一个专用于文件处理的Web服务器 能否在收到尸体之前进行检查 在config/oaut2.js文件中,我添加了以下内容: module.exports = { express: { custo

我有一个使用sailsjs开发的web服务器,它充当身份验证API。基本上,对于每个请求,它: -获取授权标头中的承载令牌 -获取传入的url 并检查请求的用户是否拥有此特定资源的权限

我希望能够在收到请求主体(可能是几GB的文件)之前执行此检查,并且在授权确定后,将这些文件发送到另一个专用于文件处理的Web服务器

能否在收到尸体之前进行检查

在config/oaut2.js文件中,我添加了以下内容:

module.exports = {
    express: {
        customMiddleware: function(app){

        /***** OAuth authentication before accepting large files *****/
        app.post('/test',
            function(req, res, next){
                passport.authenticate(
                    'bearer',
                    function(err, user, info)
                    {
                        if ((err) || (!user))
                        {
                            res.send(401);
                            return;
                        }
                        delete req.query.access_token;
                        req.user = user;
                        return next();
                    }
                )(req, res);
            },
            function(req, res){
                // HERE WILL BE HANDLED THE LARGE FILE
                return res.json({status: 'ok'});
            });
        }
    }
}

但是,即使承载令牌不正确,第二个功能(处理文件的功能)也会被触发

当然,至少在使用plain express时是这样。我不能对任何细节发表评论。只需确保执行授权的中间件或请求处理程序位于将主体流式传输到上游服务器的处理程序之前

app.post('/big-file-upload', checkBearerToken, upstream);
只要身份验证失败,checkBearerToken不调用next,您就可以放弃请求而不处理正文


对于sailsjs,您似乎可以使用修改中间件顺序。

在Sails 0.9.x中,实际上没有一种方法可以提前进行正文解析。请看这里:

在该代码中,您可以看到customMiddleware在主体解析器之后使用


如果您希望对中间件进行更细粒度的控制,则需要升级到Sails 0.10.x,并按照Peter Lyons answer中的链接了解更多有关此操作的详细信息。

请注意,对于大多数Internet,假设一次请求可以完成数千兆字节的上传并不是一个好的假设。您可能想考虑一种方法,如果传输中途中断,则支持恢复上载。我已经设置了一个基本的SavsJS项目来测试这个,但是一旦接收到包含大文件的整个请求,就会触发CHECKBURER令牌。Sails使用plain express,它只是以一种干净的方式包装内容。node/express支持流式处理,并在消息头到达但正文流式处理后立即调用中间件/处理程序。有关示例,请参见。你确定你的应用程序中没有配置app.usebodyParser吗?根据“好问题”指南发布一个最小的代码片段将有助于更有效地回答您的问题。我使用sailsjs作为后端框架,这可能是立即调用bodyParser的原因。我添加了一些代码来说明,但即使承载器不正确,也会调用bodyPArser并引发错误