我正在创建一个生产angularJs
应用程序。
现在我已经创建了我的RESTFul
API
的一部分
此API
在登录时会生成一个user
对象,但我不热衷于通过HTTP标头发送密码
未加密/未加密。
为了让您了解我的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后进行验证?
这是超级晚了,但是您不能在使用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() {
}
}
});
JWT 可用于加密和非加密数据。但是,无论您是否对要传输的信息进行加密,总会涉及一个签名过程,该过程允许您在阅读之前验证您收到的信息是否未被篡改。
对于通过域之间的URL传输登录状态的用例,我认为在JWT中根本不包含密码是最好的选择。
以以下过程为例:
>
对用户进行身份验证。如果成功,创建一个至少包含以下内容的JWT:
2.1.exp:到期时间(假设当前时间最多10到15秒)
2.2.iat:令牌创建时间
2.3。email:用户的电子邮件地址
2.4.不包括用户密码(或任何其他有意义的数据)。
在URL中使用您的JWT令牌将您的用户重定向到您的域名2
这是因为只要JWT数据有效,第二个域实际上就不需要知道您的用户密码,因为domain1服务器已经验证了登录,只是告诉domain2接受它。只要您的JWT密钥完全保密,这应该是相当安全的。如果可能的话,我还鼓励使用一种自动的方法,定期在两台服务器上随机更改您的密钥。
注意:使用这种方法,任何持有JWT的人都可以查看其中包含的数据——因此不要在那里传输任何机密或敏感信息。
注意2:无论您在JWT的到期字段中设置什么时间段,此方法都容易受到重放攻击。如果第三方可以在这段时间内获得令牌,他们也可以使用令牌以该用户的身份登录。因此,您必须将到期字段设置得尽可能低,以降低这种风险。
我正在编制一份登记表。它具有以下要求: 可以包含大写字母、大写字母、数字和字符集 不能包含空格 长度从5个字符到16个字符 我会像这样检查弦。 现在有两个问题我可以进入空间,虽然我不应该。我可以使用列出的字符以外的字符。我怎么解决这个?
接口说明 用来验证输入的用户名称是否已注册 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/user/1.0.0/validateUserName 是否需要登录 否 请求字段说明 参数 类型 请求类型 是否必须 说明 username string form 是 用户名 响应字段说明 参数 类型 说明 usernameVa
我正在尝试使用正则表达式和PHP进行用户名验证。要求是: < li >没有空格 < li >仅小写字母和数字 < li >除了(.)、(-)、(_)以及用户不能同时使用两个或多个特殊字符 < li >用户名不应以特殊字符开头 < li >最小长度6,最大长度25 这就是我到目前为止所做的
我想创建一个登录,用户只需输入他/她的邮件地址,并通过电子邮件进行验证。使用firebase,到目前为止我有这样的代码: > 当用户在将邮件放入字段中后单击按钮登录时。我尝试创建一个新帐户(密码是随机的,因为我不需要它)。如果它不存在,我会发送验证邮件。如果该帐户存在,我会与checkIfVerifiedUser核实用户是否通过单击邮件来验证该帐户。 这是我调用的方法: 问题是我要么firebas
客户已创建密钥存储库并存储凭据。为了验证密钥存储库,我已经在节点中创建了应用程序,并使用客户端id和客户端机密,我能够读取机密。但是现在客户不想使用客户id和客户机密,而是使用AZURE的用户名和密码来访问程序中的keyvault。它是一个没有MFA的keyvault访问的专用用户。 我不确定我们是否可以从节点JS使用用户名和密码访问keyvault。敬请建议。 谢谢
问题内容: 目前,我正在使用Spring Security编写Web应用程序。我们有一个通过用户名和密码对用户进行身份验证的Web服务。 网络服务: 如何配置Spring Security将提供的用户名和密码传递给Web服务? 我写了一个仅接收用户名的。 我认为问题出在您的xml中。您是否关闭了自动配置?并且您的类是否扩展AbstractUserDetailsAuthenticationProvi