2016-03-31 8 views
4

私はAPIエンドポイントを保護するためにexpress-jwtを使用しており、認証されたユーザーだけが自分のAPIにアクセスできるようにしています。今私はまた、ユーザーの役割にも基づいて自分のAPIを保護したい。たとえば、ユーザーが管理者である場合はいくつかのAPIにアクセスし、スーパー管理者であればアクセスすることができます。これをどのように達成できますか?このコードはAPIコントローラ機能で認証を行っているように見えますexress-jwtによるロールベースの認可?

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

:私は急行-JWT githubのドキュメントで、このコードスニペットを見つけました。それは唯一の推奨方法ですか?これを行うためのより良い方法はありますか?これに関するベストプラクティスに関するアドバイスはありますか?

答えて

5

これは唯一の推奨方法ですか?

かなりそうです。

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

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


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); 

を使用することができ、このセットアップのバリエーションの数十がありますが、これは全体のアイデアを取得します。

+0

多くの場合、承認の方法について詳しく教えてください。特に、たとえば、私は3つのユーザー役割、スーパー管理者、管理者、ユーザーと10のAPIエンドポイントを持っており、簡単にAPI 1、API 2、... API 10と呼ぶことができます。管理者はAPI 1 - > API 3にアクセスできます。スーパー管理者とユーザーだけがAPI 4 - > API 6にアクセスできます。他のユーザーはすべての認証済みユーザーにアクセスできますか?私が考えることができる解決策は、API 1 - > API 3とAPI 4 - > API 6の2つのミドルウェアハンドラを記述することです。あなたのものは何ですか? – congtrungvnit

+1

これは役割情報がトークンに格納されていることを意味しますか? – Learner

関連する問題