如何在 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寄存器的地址指针
如何解决未处理的拒绝 TypeError: Converting circular structure to JSON for jwt.sign