在使用expressjs阅读机构之前检查授权

时间:2014-07-30 07:25:11

标签: node.js http express sails.js

我有一个用作身份验证API的Web服务器(使用sailsjs开发)。基本上,对于每个请求,它:
     - 获取授权标题中的承载令牌
     - 获取传入的URL 并检查所请求的用户是否拥有此特定资源的权利。

我希望能够在收到请求正文(可能是几千兆字节的文件)之前进行此检查,并且一旦授权就可以,将这些文件发送到另一个专用于文件处理的网络服务器

可以在收到身体之前完成检查吗?

在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'});
            });
        }
    }
}

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

2 个答案:

答案 0 :(得分:0)

当然,至少用普通快递。我无法评论任何sailsjs细节。只需确保执行授权的中间件或请求处理程序在将主体流式传输到上游服务器的处理程序之前。

app.post('/big-file-upload', checkBearerToken, upstream);

只要身份验证失败,checkBearerToken就不会调用next(),您可以在不处理正文的情况下放弃请求。

对于sailsjs,您似乎可以使用the steps described in this answer修改中间件订单。

答案 1 :(得分:0)

在Sails 0.9.x中,没有真正的方法可以进入正文解析。见这里:https://github.com/balderdashy/sails/blob/v0.9.16/lib/express/index.js#L161

在该代码中,您可以看到customMiddleware在body解析器之后使用()' d。

如果您想要对中间件进行更细粒度的控制,您需要升级到Sails 0.10.x,并按照Peter Lyons回答中的链接获取有关此操作的更多详细信息。