0

Express.jsフレームワークで構築されたNode.jsアプリがあります。ユーザーが特定のリクエストを実行する権限を持っていることを確認したいのですが、これを行うには、クライアントにヘッダーでアクセストークンを提供するように要求します。クライアントがアクセスできる個々の機能のそれぞれにこれを追加したくありません。このように、ユーザーに関する情報リクエストの場合:

exports.info = function(req, res) {
    var userId = req.params.id,
        accessToken = req.headers["accesstoken"];
    console.log("received request to get info for userID <"+ userId +">");
    users.User.findOne({accessToken: accessToken}, function(err, user) {
        if(user == null) {
         ...

どうすればこれをより高いレベルで行うことができますか?このヘッダー要件をエクスプレス用のグローバルのどこかに設定できますか?基本的にはユーザーログイン機能以外のすべての機能でやりたいので、1つを除いてすべての機能。

4

3 に答える 3

1

あなたは小さなミドルウェアを作ることができます:

verifyUser = function(req,res,next){
  var userId = req.params.id, accessToken = req.headers["accesstoken"];
  console.log("received request to get info for userID <"+ userId +">");
  users.User.findOne({accessToken: accessToken}, function(err, user) {
    if(user == null) {
      ...
    }

     next()
  }
}

それで:

1つのリクエストで:

app.get("/user/info", verifyUser, exports.info)

リクエストの選択について:

app.all(SomeRegex, verifyUser)

すべての要求について:

app.use(verifyUser)
于 2013-02-25T19:04:19.743 に答える
0

すべてのリクエスト処理の前に実行されるもう1つのエクスプレスミドルウェアとして関数を追加するだけです。

app.use(function(req, res, next) {
    var userId = req.params.id,
        accessToken = req.headers["accesstoken"];
    console.log("received request to get info for userID <"+ userId +">");
    users.User.findOne({accessToken: accessToken}, function(err, user) {
        if(user != null) {
            return next();  // This is ok, keep processing
        } else {
            // don't call next, redirect to login page, etc...
        }
}

app.get('/home', ...);
apg.get('/some_other_page');

nextを呼び出して、エクスプレスを通常どおり処理するか、リダイレクトを使用するか、エラーを返し、nextを呼び出さないでください。

于 2013-02-25T19:02:36.810 に答える
0

ミドルウェアを作成し、各ルートに設定できます。承認する必要があります。例:

var myAuthMiddleware = function (req, res, next) {

    // Here goes your code to check if the user complies
    // with the conditions. You can use req.headers, req.user, etc

    if (conditionIsMet) return next();  // If the user complies, you continue the process

    // The user doesn't comply
    return res.send('Error');
}

次に、必要なルートで彼のミドルウェアを使用します。

app.get('/my-route', myAuthMiddleware, myRouteHandler);
app.post('/another-route', myAuthMiddleware, myOtherRouteHandler);
// This one doesn't need auth
app.get('/', indexHandler);
于 2013-02-25T19:03:47.410 に答える