8

multerExpress4のマルチパートミドルウェアとして使用しています。

Express はパスポートを認証ミドルウェアとして使用するように構成されていますが、ユーザーが認証されていない場合にファイルのアップロードを防止する方法が見つかりません。

onFileUploadStart を使用してファイルを拒否しようと考えましたが、ユーザーを照合できる"request" オブジェクトとのリンクが見つかりません。

以下のコードは、express と multer を構成する際に使用します。

...
// Multipart file upload
app.use(multer(
{
  dest: wwwroot + path.sep + 'uploaded' + path.sep, 
  onFileUploadStart: function (file) {
    //TODO : apply security check : user auth, file size, number...
    console.log(file.fieldname + ' is starting ...')
},
onFileUploadComplete: function (file) {
    console.log(file.fieldname + ' uploaded to  ' + file.path)
}
}));
...
app.use(passport.auth.initialize());
app.use(passport.auth.session());   
4

3 に答える 3

7

EDIT

I'll leave the answer below in case it helps, but the answer is actually quite simple: you need to move the two calls to app.use(passport) above the call to app.use(multer). Each step in the express chain is processed in order, so if you wish reject a bad auth attempt, do it before you handle the incoming file upload.


There is probably a better way to do this, but this should get you started. Change your express config to use a closure and you'll have full access to the req variable.

app.use(function(req, res, next) {
  var handler = multer({
    dest: wwwroot + path.sep + 'uploaded' + path.sep, 
    onFileUploadStart: function (file) {
      // You now have access to req
      console.dir(req);
      console.log(file.fieldname + ' is starting ...')
    },
    onFileUploadComplete: function (file) {
      console.log(file.fieldname + ' uploaded to  ' + file.path)
    }
  });
  handler(req, res, next);
});
于 2014-09-18T06:15:50.233 に答える
4

さて、私はあなたのための解決策を得たと思います。これは私自身の問題の完全な解決策ではありませんが、ファイルをダウンロードする前にユーザーが Passport を介して承認されているかどうかを確認する特定のケースに役立ちます。

秘訣は、投稿ハンドラーでミドルウェアを使用して、一度に 1 つのことを行うことです。最初のパスポートが呼び出され、ユーザー オブジェクトが req オブジェクトに配置されます。次に、ユーザーが認証されているかどうかを確認します。その場合は、ファイルをダウンロードしてから使用してください。サンプルは次のとおりです。

//don't add multer as a middleware to all requests. 
//If you do this, people will be able to upload files
//in ALL YOUR 'post' handlers!!! 
var Multer = require('multer');

//this is a middleware to check if user is authenticated
function check(req, res, next){
    if(req.isAuthenticated()){
        console.log(req.user);
        next();
    }
    else{
        res.send(401);
    }
}

//this is a middleware to be called after file is downloaded
function finish(req, res, next){
    var filePath = req.files.file.path;
    res.send("Hello " + req.user.name + "! Your file was uploaded to " + filePath);
}

//this is the route handler. First check auth. If so, 
//proceed to multer middleware to download file
//lastly, use the file as you need
app.post('/test', [check, Multer(), finish]);

これが機能するのは、Passport がユーザーの認証に本文データを使用しないためです。つまり、本文に含まれていないセッションを使用します。したがって、Passport を使用してユーザー データを取得することはできますが、たとえば、ファイルのダウンロードを開始する前に、ファイル以外のフィールドがすべて解析されていることを確認することはできません (それらはすべて高速要求ストリームにまとめられるため)。

于 2014-10-17T08:04:27.477 に答える