8

Express-jwt を使用して API エンドポイントを保護し、認証されたユーザーのみが API にアクセスできるようにしています。ここで、ユーザーの役割にも基づいて API も保護したいと考えています。たとえば、ユーザーは、管理者の場合は一部の API にのみアクセスでき、スーパー管理者の場合は他の API にのみアクセスできます。どうすればこれを達成できますか? 私はexpress-jwt github docでこのコードスニペットを見つけました:

app.get('/protected',
  jwt({secret: 'shhhhhhared-secret'}),
  function(req, res) {
    if (!req.user.admin) return res.sendStatus(401);
    res.sendStatus(200);
  });

このコードは、API コントローラー関数で承認を行っているようです。それは唯一の推奨される方法ですか?これを行うためのより良い方法はありますか?このためのベスト プラクティスに関するアドバイスはありますか?

4

1 に答える 1

9

それは唯一の推奨される方法ですか?

かなり、ええ。

ただし、これは「コントローラー機能」ではありません。これは、この場合に使用するミドルウェアの例です。

より完全な例は次のようになります。


var router = new express.Router();

// process jwt stuff
var processjwt = jwt({secret: 'shhhhhhared-secret'});

// authorization check
function authorizationCheck(req, res, next) {
  if (!req.user.admin) { 
   return res.sendStatus(401);
  } else {
    // move to the next middleware, cause it's ok
    next();
  } 
}

// the real route handler
function myRouteHandler(req, res){
  doSomeWork(function(err, data){
    if (err) { return next(err); }
    res.json(data);
  });
}

// put it all together
router.use("/protected", processjwt, authorizationCheck);
router.get("/protected", myRouteHandler);

使用できるこのセットアップには数十のバリエーションがありますが、これでアイデアが伝わります。

于 2016-03-31T18:12:37.417 に答える