gpt4 book ai didi

javascript - 使用 Node js、AngularJs 和 JWT 使用用户名和密码进行身份验证

转载 作者:搜寻专家 更新时间:2023-10-31 23:48:07 24 4
gpt4 key购买 nike

我正在创建一个生产 angularJs 应用程序。

现在我创建了部分 RESTFul API

API 在登录时生成一个 user 对象,但是我并不热衷于通过 HTTP header 发送未散列/未加密的 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 后对其进行验证?

最佳答案

JWT 可用于加密和非加密数据。但是,无论您是否对正在传输的信息进行加密,总会涉及一个签名过程,使您可以在阅读信息之前验证您收到的信息是否未被篡改。

对于通过域之间的 URL 传输登录状态的用例,我认为在您的 JWT 中根本不包含密码将是最佳选择。

以下面的流程为例:

  1. 通过 HTTP 将您的登录详细信息发布到 domain1。
  2. 验证用户。如果成功,创建至少包含以下内容的 JWT:

    2.1。 exp:过期时间(比方说当前时间 + 最多 10 到 15 秒)

    2.2。 ia:代币创建时间

    2.3。 email:用户的邮箱地址

    2.4。 包含用户密码(或任何其他敏感数据)。

  3. 使用 URL 中的 JWT token 将您的用户重定向到您的域2

  4. 您的其他服务器/域可以检查 JWT 签名、iat 和 exp 时间以验证 JWT 未被篡改并且有效。
  5. 如果全部有效,请将您的用户登录到其他域。

这是有效的,因为只要 JWT 数据通过验证,第二个域实际上不需要知道您的用户密码,因为 domain1 服务器已经验证了登录并且只是告诉 domain2 接受它。只要您的 JWT key 保持完全保密,这应该是相当安全的。 如果可能的话,我还鼓励使用自动方法定期随机更改两台服务器上的 key 。

注意:使用此方法,任何获得 JWT 的人都可以查看其中包含的数据 - 因此不要在那里传输任何 secret 或敏感信息。

注意 2:无论您在 JWT 的到期字段中设置什么时间段,此方法都容易受到重放攻击。如果第三方可以在该时间段内获得 token ,他们也可以使用 token 以该用户身份登录。出于这个原因,您必须将过期字段设置得尽可能低,以降低这种风险。

关于javascript - 使用 Node js、AngularJs 和 JWT 使用用户名和密码进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28732814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com