如何将IP地址作为jwt.sign中的参数

时间:2017-12-12 13:33:58

标签: javascript authentication ip jwt

我有id,用户名,名字,但我也想要IP地址。

这是当前的功能:

我使用MEAN堆栈,我想在我的身份验证方法中加入IP地址。目前,使用具有参数id,name,username的用户模型,如上所述对令牌进行签名。

2 个答案:

答案 0 :(得分:0)

我了解您已经在应用程序的登录控制器中,并且您只是生成令牌。

此示例使用lowdb数据库而不是您的mongodb,但您和其他任何人都应该能够将其调整为任何模型。

此问题的相关部分是第17行的ip: req.connection.remoteAddress

如果您的createToken函数不在中间件中,您需要将整个请求对象或至少IP传递给它。

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 :(得分:-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;