我正在创建一个生产angularJs
应用程序。
现在我已经创建了RESTFul
API
此API
会在登录时生成user
对象,但我并不热衷于通过HTTP标头发送password
未加入/未加入的对象。
为了让您了解我的API
:
登录时:
var jwt = require('jwt-simple');
// Route: /login
module.exports = function (express, sequelize, router) {
var DataTypes = require("sequelize");
var crypto = require('crypto');
var User = sequelize.define('user', {
id: DataTypes.INTEGER,
username: DataTypes.STRING,
name: DataTypes.STRING,
organization_id: DataTypes.INTEGER,
type_id: DataTypes.INTEGER,
division_id: DataTypes.INTEGER
}, {
freezeTableName: true,
instanceMethods: {
retrieveByNamePassword: function (username, onSuccess, onError) {
User.find({where: {username: username}}, {raw: true})
.then(onSuccess).catch(onError);
}
}
}
);
router.route('/login')
.post(function (req, res) {
var user = User.build();
var username = req.body.username || '';
var password = req.body.password || '';
if (username == '' || password == '') {
res.status(401);
res.json({
"status": 401,
"message": "Invalid credentials"
});
return;
}
user.retrieveByNamePassword(username, function (users) {
if (users) {
// If authentication is success, we will generate a token
// and dispatch it to the client
res.json(genToken(users));
return;
} else {
// If authentication fails, we send a 401 back
res.status(401);
res.json({
"status": 401,
"message": "Invalid credentials"
});
return;
}
}, function (error) {
res.status(401);
res.json({
"status": 401,
"message": "Invalid credentials"
});
return;
});
});
var genToken = function(user) {
var expires = expiresIn(7); // 7 days
var token = jwt.encode({
exp: expires,
user_id: user.id,
organization_id: user.organization_id,
type_id: user.type_id,
division_id: user.division_id
}, require('./config/secret')());
return {
token: token,
expires: expires,
user: user
};
};
var expiresIn = function(numDays) {
var dateObj = new Date();
return dateObj.setDate(dateObj.getDate() + numDays);
};
正如您现在所看到的(因为我还不确定如何处理它)我只查找用户名然后检查用户名是否存在。
我的问题很简单,如何加密密码,然后在到达API后对其进行验证?
答案 0 :(得分:2)
JWT可以与加密和非加密数据一起使用。但是,无论您是否正在加密正在传输的信息,都会有一个签名过程,允许您在阅读之前验证您收到的信息是否未被篡改。
对于通过域名之间的URL转移登录状态的用例,我会说JWT中不包括密码将是最佳选择。
以下面的过程为例:
对用户进行身份验证。如果成功,请创建至少包含以下内容的JWT:
2.1。 exp :到期时间(假设当前时间最多+ 10到15秒)
2.2。 iat :令牌创建时间
2.3。 电子邮件:用户的电子邮件地址
2.4。 不包含用户密码(或任何其他敏感数据)。
使用网址中的JWT令牌将您的用户重定向到您的域名
这是有效的,因为只要JWT数据验证,第二个域实际上不需要知道您的用户密码,因为domain1服务器已经验证了登录并且只是告诉domain2接受它。只要您的JWT密钥保持完全保密,这应该是相当安全的。 我还鼓励在可能的情况下,定期在两台服务器上随机更改密钥的自动方法。
注意:使用此方法,任何掌握JWT的人都可以查看其中包含的数据 - 因此不要在那里传输任何机密或敏感信息。
注意2:在JWT的到期字段中设置的任何时间段内,此方法都容易受到重播攻击。如果第三方可以在该时间范围内获得令牌,他们也可以使用令牌以该用户身份登录。因此,您必须将到期字段保持尽可能低,以降低此风险。
答案 1 :(得分:1)
这是超级晚了,但是你能不能在使用crypt的用户模型之后添加一个钩子? (像这样:https://www.youtube.com/watch?v=pquxHIBx8ks)
// User model...
}, {
hooks: {
beforeValidate: function() {
},
afterValidate: function(User) {
User.hashword = bcrypt.hashSync(User.hashword, 10);
},
beforeCreate: function() {
},
afterCreate: function() {
}
}
});