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

Posted

技术标签:

【中文标题】如何在 jwt.sign 中将 IP 地址作为参数【英文标题】:How to have IP address as a parameter in jwt.sign 【发布时间】:2018-05-26 05:12:48 【问题描述】:

我有 id、用户名、姓名,但我还想要 IP 地址。

这是当前函数:

;

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

【问题讨论】:

这个问题严重不完整。 user 是什么?您在哪种服务器上运行?我看到了一个 mongodb 标签,但没有其他任何东西可以解释你实际上想要做什么。 我对它进行了一些扩展。我想要的只是 IP 地址成为令牌的一部分。 您有可用的 Express 请求对象吗? 是的,我正在使用快递 好的,我正在写答案。给我10分钟 【参考方案1】:

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

此示例使用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);

【讨论】:

【参考方案2】:

可以在 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; 

【讨论】:

只有在您和客户之间确实存在代理时才需要这样做,并且 OP 没有提到有一个。另外,我会指出,如果您和客户端之间有任何其他代理,您不应该相信标头包含原始客户端的实际地址。标头很容易被欺骗。

以上是关于如何在 jwt.sign 中将 IP 地址作为参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在汇编函数中将元素数组作为参数传递时转发ARM寄存器的地址指针

放置jwt.sign代码时出现JWT错误

如何解决未处理的拒绝 TypeError: Converting circular structure to JSON for jwt.sign

如何在 Android Java 中将 MAC 地址转换为 IP?

在Python中将IP地址字符串转换为二进制

如何在负载均衡器 Laravel 后面的 nginx 中将远程 IP 地址列入白名单