2016-07-22 6 views
0

私は要求を認証し、私のNode.jsサーバー上の認証ルートを持っている:私はそれを理解したようNode.jsのコールバック()

app.get('/loggedin', auth, function(req, res){ 
    console.log(req.authenticated); 
    res.send(req.authenticated ? req.authenticated: false) 
}) 

authapp.get()前に実行されます。サーバーログで

var jwt = require('jsonwebtoken'); 
var config = require('./config'); 

module.exports = function(req,res,next){ 
    var bearerHeader = req.headers['authorization']; 
    var token; 
    console.log(bearerHeader); 
    req.authenticated = false; 
    if (bearerHeader){ 
     console.log("11111"); 
     var bearer = bearerHeader.split(" "); 
     token = bearer[1]; 
     jwt.verify(token, config.secret, function (err, decoded){ 
      console.log("22222"); 
      if (err){ 
       console.log(err); 
       req.authenticated = false; 
       req.decoded = null; 
      } else { 
       console.log("33333"); 
       req.decoded = decoded; 
       req.authenticated = true; 
      } 
     }); 
    } 
    next(); 
} 

しかし、私は次のような出力を受け取り、::ここでauthためのコードがある

Bearer jsflkdjlsdfjksodfkjlsdfjkls 
11111 
false 
22222 
33333 

これは、クライアント側のトークンがあることを意味し、それはパスですjwt検証。ただし、サーバは認証コールバックで情報を返す前にapp.get()の実行を開始することを決定します。何がありますか?

+0

は、あなたが)(次を呼び出す前に5秒の待機を追加することができます:あなたはどちらかの結果を持っているだけで後next()を呼び出すためにこれを回避する唯一の方法。私はそれがログライティングの問題ではないことを確認したい。 – limbo

+0

@limboさて、出力は同じです。これは実際には 'jwt.verify()'を呼び出す前に一時停止するので、ロジックは 'jwt.verify()'の後のコードにすぐに渡されます。 – db2791

答えて

1

[OK]を修正しました。問題はjwt.verify()が非同期であるため、すぐには実行されないということです。認証時

module.exports = function(req,res,next){ 
    var bearerHeader = req.headers['authorization']; 
    var token; 
    console.log(bearerHeader); 
    req.authenticated = false; 
    if (bearerHeader){ 
     console.log("11111"); 
     var bearer = bearerHeader.split(" "); 
     token = bearer[1]; 
     jwt.verify(token, config.secret, function (err, decoded){ 
      console.log("22222"); 
      if (err){ 
       console.log(err); 
       req.authenticated = false; 
       req.decoded = null; 
       next(); 
      } else { 
       console.log("33333"); 
       req.decoded = decoded; 
       req.authenticated = true; 
       next(); 
      } 
     }); 
    } 
} 
関連する問題