2017-12-12 11 views
-2

ID, 사용자 이름, 이름이 있지만 IP 주소도 필요합니다.jwt.sign의 매개 변수로 IP 주소를 갖는 방법

여기에 현재 기능이 있습니다.

;

평균 스택을 사용 중이며 인증 방법에 IP 주소를 통합하려고합니다. 현재 토큰은 id, name, username 매개 변수가있는 사용자 모델을 사용하여 위와 같이 서명됩니다.

+0

이 질문은 심각하게 불완전합니다. '사용자'는 무엇입니까? 어떤 종류의 서버에서 실행하고 있습니까? 나는 mongodb 태그를 보았지만 당신이 실제로하려고하는 것을 설명하는 것은 아무것도 없었다. – Demonblack

+0

조금 더 확장했습니다. 내가 원하는 것은 토큰의 일부가 될 IP 주소입니다. –

+0

Express 요청 개체를 사용할 수 있습니까? – Demonblack

답변

0

나는 애플리케이션의 로그인 컨트롤러에 있으며 토큰을 생성하고있는 것으로 알고 있습니다.

이 예에서는 mongodb 대신 lowdb 데이터베이스를 사용하지만 독자와 다른 사람이 읽는 다른 모델을 모든 모델에 적용 할 수 있어야합니다.

이 질문에 대한 관련 부분은

당신의 createToken 기능은 미들웨어 내부가 아닌 경우, 당신은 그것을 전체 요청 객체 또는 적어도 IP를 전달하거나해야합니다 라인 (17)에 ip: req.connection.remoteAddress입니다.

server.post("/login", function(req, res, next) { 

    var username = req.body.username; 
    var password = req.body.password; 

    var user = lowdb.get("user").find((x) => { return x.username == username; }).value(); 

    if (!user) { 
     res.status(401).json({ message: "Authentication failed. User not found." }); 
     req.connection.destroy(); //Make sure processing can't continue even if somewhere along the stack someone accidentally called next() more than once 
    } else if (user) { 
     var auth = user.authenticationData; 

     if(_cryptCompare(auth.salt + "|" + password, auth.hash)){ 
      var DURATION = 3600*8; 

      var token = jwt.sign({ userId: user.id, roles: user.roles, ip: req.connection.remoteAddress }, _SECRET, {expiresIn: DURATION}); 
      var expiration = new Date();     
      expiration.setSeconds(expiration.getSeconds() + DURATION); 

      res.json({ token: token, expires: expiration }); 
     } else { 
      res.status(401).json({ message: "Authentication failed. Wrong password." }); 
      req.connection.destroy(); //Make sure processing can't continue even if somewhere along the stack someone accidentally called next() more than once 
     } 
    } 
} 
); 

function _cryptCompare(str1, str2){ 
    return bcrypt.compareSync(str1, str2); 
} 
-1

Express에서는 req.headers['x-forwarded-for']을 사용하여 원격 IP 주소에 액세스 할 수 있습니다.

function createToken(user) { 
    var token = jwt.sign({ 
    id: user._id, 
    name: user.name, 
    username: user.username, 
    ipaddress: req.headers['x-forwarded-for'] 
    }, secretKey, { 
    expiresIn: 120 
    }); 
    return token; 
+0

이것은 실제로 당신과 클라이언트 사이에 프록시가있는 경우에만 필요하며 OP는 가지고 있지 않다는 것을 OP는 언급하지 않았습니다. 또한, 귀하와 클라이언트 사이에 다른 프록시가있는 경우 원래 클라이언트의 실제 주소를 포함하도록 헤더를 신뢰해서는 안된다는 점을 지적 할 것입니다. 헤더는 쉽게 스푸핑 될 수 있습니다. – Demonblack