使用Express Passport和Sequelize进行电子邮件验证



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

我的伪代码是这样的

1.用户注册

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

3.令牌是使用加密货币生成的。

4.令牌将发送到提供的电子邮件ID。

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

同时,将创建一个单独的续集架构来存储电子邮件 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;
}

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

相反,请尝试此方法;

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

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

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

大功告成。

最新更新