2017-01-28 4 views
1

내 MIDDLEWARE는 사용자가 제공 한 토큰이 올바른지 확인합니다. jsonwebtoken을 사용하여 구현 된 보안 통제는 미들웨어 내부에 있었고 정상적으로 작동했습니다. 이 보안 검사를 다른 파일로 옮기기로 결정한 후 TokenManger.js로그인 예 nodejs 및 jsonwebtoken : 토큰 확인 결과를 읽을 수 없음

두 파일간에 코드를 설정하는 방법을 모르겠습니다. 여러 가지 방법을 시도했지만 아무도 작동하지 않습니다.

더 나은 이해를 위해 다음 예제 코드를 붙여 넣습니다. 작동하지 않습니다.

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; 

실제로 createToken(user) 함수 이전에 잘 작동 다음 TokenManager.js 구현이 일례이다

... 
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!' 
      }); 
     } 
}); 
... 

반면에 (작업이 아닌)이 미들웨어에 관한 코드의 경우 verifyToken(token, admin, decode) 기능에만 문제가 있습니다. 그러나 나는 디자인에 관심이 있습니다. 그래서 당신이 창조에 대한 제안을 가지고 있다면, 환영받을 만하다.

그냥이 내가 createToken(user) 함수를 호출하는 방법이다, 그림을 완성하기 :

... 
.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

verifyToken'하지만 서명에 콜백이 없습니다. 'verifyToken'의 –

답변

2

당신은 verifyTokenfunction(err, key)를 전달하는,하지만 verifyToken의 서명에 없다 callback입니다.

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

업데이트verifyToken 기능을 변경해보십시오 : 콜백없이

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

을 그리고 당신의 미들웨어에서 다음과 같이 사용합니다 : 당신은`에 콜백을 전달하는

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

콜백 없이도 veryToken 함수를 사용할 수 있습니까? asyn 방식이어야합니까? – pittuzzo

+0

예, 콜백없이'verifyToken'을 작동시킬 수 있습니다. 그러나'async' 나'callback'이 없으면 잡히지 않아도됩니다. 여기에서 설명했습니다. https://stormpath.com/blog/nodejs-jwt-create-verify#how-to-verify-jwts 업데이트 된 답변을 확인하십시오. –