2017-01-28 4 views
1

Meine MIDDLEWARE prüft, ob die von Benutzern bereitgestellten Tokens korrekt sind. Die Sicherheitskontrolle, implementiert mit jsonwebtoken, war in der Middleware und es funktionierte gut. Nachdem ich beschlossen habe, all diese Sicherheitskontrollen in eine andere Datei zu verschieben: TokenManger.jsLogin Beispiel mit nodejs und jsonwebtoken: kann das Token-Verifizierungsergebnis nicht lesen

Aber ich weiß nicht, wie man den Code zwischen den beiden Dateien einstellt. Ich habe viele Möglichkeiten ausprobiert, aber niemand arbeitet.

Also nur zum besseren Verständnis füge ich im folgenden einen Beispielcode ein, der nicht funktioniert. Dies ist über die Middleware:

... 
router.use(function(req,res,next){ 
     var token = req.body.token || req.query.token || req.headers['x-access-token']; 
     //decode token 
     if(token){ 
      TokenManager.verifyToken(token,true,function(err,key){ 
       if(err) return res.json({ success : false, message : "Failed to authenticate token"}); 
       else next(); 
      }); 
     }else{ 
      // no token, return error 
      return res.status(403).send({ 
       success : false, 
       message: 'No token provided!' 
      }); 
     } 
}); 
... 

In der anderen Hand dies ein Beispiel ist (und nicht in Betrieb) Umsetzung der TokenManager.js:

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

var TokenManager = { 
    createToken: function(user) { 
     if(user.admin){ 
      var token = jwt.sign(user, config.SECRET_WORD.ADMIN,{expiresIn:config.EXPIRE_TIME.ADMIN_TOKEN}); 
     }else{ 
      var token = jwt.sign(user, config.SECRET_WORD.USER,{expiresIn:config.EXPIRE_TIME.USER_TOKEN}); 
     } 
     return token; 
    }, 
    verifyToken: function(token, admin, decode){ 
     if(admin){ 
      //admin authentication 
      jwt.verify(token, config.SECRET_WORD.ADMIN, function(err,key){ 
       if(err){ 
        return false; 
       }else{ 
        return true; 
       } 
      }); 
     }else{ 
      //user authentication 
      jwt.verify(token, config.SECRET_WORD.USER, function(err,key){ 
       if(err){ 
        return false; 
       }else{ 
        return true; 
       } 
      }); 
     } 
    } 
} 

module["exports"] = TokenManager; 

Tatsächlich ist die createToken(user) Funktion arbeitet gut mit dem vorherigen Code, gibt es Probleme nur mit der verifyToken(token, admin, decode) Funktion. Aber ich interessiere mich für das Design, also, wenn Sie auch Vorschläge über die Kreation haben, sind sie mehr als willkommen.

einfach das Bild zu vervollständigen, das ist, wie ich die createToken(user) Funktion aufrufen:

... 
.post(function(req,res){ 
     User.findOne({ username: req.body.username }, function(err,user){ 
      if(err) throw err; 
      if(!user){ 
       res.json({ success: false, message: 'Authentication failed. User not found!' }); 
      }else{ 
       if(user.password != req.body.password){ 
        res.json({ success: false, message: 'Authentication failed. Wrong password!' }); 
       }else{ 
        //token creation 
        var token = TokenManager.createToken(user); 
        res.json({ 
         success: true, 
         token: token 
        }); 
       } 
      } 
     }); 
    }); 
... 
+0

Sie Rückruf sind vorbei zu ' VerifyToken', aber es gibt keinen Callback in der Signatur von 'verifyToken'. –

Antwort

2

Du function(err, key)-verifyToken vorbei, aber es nicht callback in der Signatur von verifyToken ist.

Versuchen Sie, die verifyToken Funktion

verifyToken: function(token, admin, callback){ 
    if(admin){ 
     //admin authentication 
     jwt.verify(token, config.SECRET_WORD.ADMIN, callback); 
    }else{ 
     //user authentication 
     jwt.verify(token, config.SECRET_WORD.USER, callback); 
    } 
} 

aktualisieren Ändern: ohne Rückruf

verifyToken: function(token, admin){ 
    try { 
     if(admin){ 
      //admin authentication 
      jwt.verify(token, config.SECRET_WORD.ADMIN, callback); 
     }else{ 
      //user authentication 
      jwt.verify(token, config.SECRET_WORD.USER, callback); 
     } 
     return true; 
    } catch(err) 
     return false; 
    } 
} 

wie diese und in Ihrer Middleware verwenden:

if (TokenManager.verifyToken(token,true)){ 
    return next(); 
} else { 
    return res.json({ success : false, message : "Failed to authenticate token"}); 
} 
+0

Können Sie die Funktion "veryToken" auch ohne Rückruffunktion ausführen? sollte der asyn Weg sein? – pittuzzo

+0

Ja, wir können 'verifyToken' ohne Rückruf machen. Aber ohne 'async' oder' callback' wird ein Fehler ausgelöst, den Sie fangen müssen. Erklärt hier https://stormpath.com/blog/nodejs-jwt-create-verify#how-to-verify-jwts Überprüfen Sie meine aktualisierte Antwort. –

Verwandte Themen