【问题标题】:email validation using express passport and sequelize使用 Express Passport 和 Sequelize 进行电子邮件验证
【发布时间】:2019-12-29 08:52:08
【问题描述】:

用户注册后,我需要一个基本的电子邮件验证。

我的伪代码类似于

1.用户注册

2.他的数据存储在数据库中。

3.使用加密生成令牌。

4.token 然后发送到提供的电子邮件 ID。

5. 用户点击验证帐户的链接。

同时创建一个单独的 sequelize 架构来存储电子邮件 ID 和令牌。

现在我的问题是如何在我的项目中实现它

 passport.use('local-signup', new LocalStrategy(

        {
            usernameField: 'email',
            passwordField: 'password',
            passReqToCallback: true // allows us to pass back the entire request to the callback
        },

        function (req, email, password, done) {


            var generateHash = function (password) {
                return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null);
            };

            User.findOne({
                where: {
                    email: email.toLowerCase()
                }
            }).then(function (user) {

                if (user) {
                    return done(null, false, {
                        message: 'That email is already taken'
                    });
                }

                else {
                    var userPassword = generateHash(password);
                    var data =
                    {
                        email: email.toLowerCase(),
                        password: userPassword,
                        firstname: req.body.firstname,
                        lastname: req.body.lastname,
                        mobileno: req.body.mobileno,
                        //verified_email: false,
                        //verified_mob: false
                    };


                    User.create(data).then(function (newUser, created) {
                        if (!newUser) {
                            return done(null, false);
                        }

                        if (newUser) {
                            return done(null, newUser);
                        }
                    });
                }
            });
        }
    ));

我是 nodejs 的新手,但据我所知,我想事情需要在

中实现
if (newUser) {
           return done(null, newUser);
}

感谢任何指导。

我的用户架构..

module.exports = function (sequelize, Sequelize) {

    var User = sequelize.define('user', {
        id: {
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
        },
        firstname: {
            type: Sequelize.STRING,
            notEmpty: true
        },
        lastname: {
            type: Sequelize.STRING,
            notEmpty: true
        },
        //username: { type: Sequelize.STRING },
        //about: { type: Sequelize.TEXT },
        mobileno: {
            type: Sequelize.STRING
        },
        email: {
            type: Sequelize.STRING,
            validate: { isEmail: true }
        },
        password: {
            type: Sequelize.STRING,
            allowNull: false
        },
        last_login: {
            type: Sequelize.DATE
        },
        verified_email: {
            type: Sequelize.BOOLEAN,
            defaultValue: false,
        },
        verified_mob: {
            type: Sequelize.BOOLEAN,
            defaultValue: false,
        }
        //status: { type: Sequelize.ENUM('active', 'inactive'), defaultValue: 'active' }

    });

    return User;

}

【问题讨论】:

  • 首先,User.create(data).then(function (newUser, created) 这个then 将只有一个值,即创建的用户。您可以处理 catch 块中的任何错误。我认为这篇文章codemoto.io/coding/nodejs/… 完全符合您的要求,请查看
  • var tokenSchema = sequelize.define('tokenSchema', { _userId: { type: Sequelize.STRING, required: true, ref: 'User' }, token: { type: Sequelize.STRING, required: true }, createdAt: { type: Sequelize.DATE, required: true, default: Date.now, expires: 43200 } }); 这个翻译是否适合架构

标签: node.js express sequelize.js passport.js email-validation


【解决方案1】:

在任何情况下都不要与您的任何用户共享您的令牌。用户 ID 可以通过令牌轻松提取,这可能是有害的。

相反,试试这种方法;

  • 我假设你的用户模型在你的数据库中是这样的

{ name: String, auth: { password: String //This will be bcrypted. email: { address: String, verified: String || Boolean, } } }

  • 如您所见,已验证字段包含字符串字段或布尔字段。
  • 在你创建用户的那一刻,(model.create({...}) 序列) 将verified 的值预设为当前时间的sha256 (你可以使用sha256(moment().format())) 并保存用户。
  • 在邮件中,向用户发送一个链接,例如 yoursite.com/verify?code=[code],然后,
  • 在控制器中为 user/verify?code=[code] 创建一个路由。获取用户获取用户在已验证字段中保存的代码并将其更改为“真”

你已经完成了。

【讨论】:

  • 我对nodejs的命令和语法不是很熟悉...你能告诉我怎么做吗...
猜你喜欢
  • 2014-02-07
  • 1970-01-01
  • 2018-06-01
  • 2011-03-21
  • 2011-05-11
  • 2017-11-19
  • 2011-01-31
相关资源
最近更新 更多