我有id,用户名,名字,但我也想要IP地址。
这是当前的功能:
我使用MEAN堆栈,我想在我的身份验证方法中加入IP地址。目前,使用具有参数id,name,username的用户模型,如上所述对令牌进行签名。
答案 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;