当前位置: 首页 > 知识库问答 >
问题:

使用用户名验证

陶沛
2023-03-14

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

现在我已经创建了我的RESTFulAPI的一部分

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后进行验证?

共有2个答案

王兴庆
2023-03-14

这是超级晚了,但是您不能在使用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() {

    }
}
});
卢翔宇
2023-03-14

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

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

以以下过程为例:

>

  • 通过HTTP将您的登录详细信息发布到域1。
  • 对用户进行身份验证。如果成功,创建一个至少包含以下内容的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