javascript - 使用 expressJS 通过电子邮件确认注册
问题描述
我已经在 expresJS 中设置了一个用户填写表格的设置,然后它进入一个通过以下步骤的注册路线:
- 验证数据(清理电子邮件和用户名)
- 注册(如果数据有效,将用户保存到数据库中)
- 登录(使用passportJS)
该路线的代码:
router.post('/register',
userController.validateRegister,
userController.register,
authController.login
);
事情是,我不想直接注册用户。我想给他们发一封电子邮件,然后当点击链接时,它实际上注册了他们。
我猜这样做的方法是不在我的注册路线(注册)中使用第 2 步,而是向用户发送一封包含完成注册链接的电子邮件,然后当用户点击链接时我注册并登录他们.
所以我想如果我删除注册方法我可以跳到登录方法,解决用户登录的问题而不注册它(不保存到数据库)
但是当我提交表单时,我得到了错误:
Failed Login!
这来自登录方法:
exports.login = passport.authenticate('local', {
failureRedirect: '/login',
failureFlash: 'Failed Login!',
successRedirect: '/',
successFlash: 'You are now logged in!'
});
所以,我有点迷失了,关于如何更改我当前的设置,我在现场注册他们,他们必须点击我发送给他们的电子邮件。
这是我在注册路线中使用的方法:
exports.validateRegister = (req, res, next) => {
req.sanitizeBody('name');
req.checkBody('name', 'You must supply a name!').notEmpty();
req.checkBody('email', 'That Email is not valid!').isEmail();
req.sanitizeBody('email').normalizeEmail({
gmail_remove_dots: false,
remove_extension: false,
gmail_remove_subaddress: false
});
req.checkBody('password', 'Password Cannot be Blank!').notEmpty();
req.checkBody('password-confirm', 'Confirmed Password cannot be blank!').notEmpty();
req.checkBody('password-confirm', 'Oops! Your passwords do not match').equals(req.body.password);
const errors = req.validationErrors();
if (errors) {
req.flash('error', errors.map(err => err.msg));
res.render('register', { title: 'Register', body: req.body, flashes: req.flash() });
return; // stop the fn from running
}
next(); // there were no errors!
};
exports.register = async (req, res, next) => {
const user = new User({
email: req.body.email,
name: req.body.name,
location: {
address: req.body.location.address,
vicinity: req.body.location.vicinity,
coordinates: [
req.body.location.coordinates[0],
req.body.location.coordinates[1],
]
}
});
const register = promisify(User.register, User);
await register(user, req.body.password);
next(); // pass to authController.login
};
exports.login = passport.authenticate('local', {
failureRedirect: '/login',
failureFlash: 'Failed Login!',
successRedirect: '/',
successFlash: 'You are now logged in!'
});
护照配置如下:
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
解决方案
为什么要在用户未注册时登录?
默认情况下,您可以isVerified
在 User 模型设置中添加一个布尔属性。
仅允许属性设置为 的用户进行登录过程。false
isVerified
true
当用户单击该链接时,该链接包含在注册电子邮件中,然后您设置isVerified
为true
并且用户可以自由登录。
这样,您可以在注册期间运行 register 方法。
当用户提交注册表单时,没有理由立即登录。
您可以呈现一个信息页面,通知用户account verification
一封电子邮件已发送到他的电子邮件帐户。
推荐阅读
- excel-formula - 具有相同文件夹路径的 Excel 公式
- python - 如何正确地将虹膜清理到包含数组和整数的列表中
- ibm-cloud - 无法向 IBM Watson Studio 添加服务
- react-native - 如何在反应原生博览会中选择多个图像
- php - mysql 从基于具有相似内容的字段分组在一起的表中选择字段
- reactjs - create-react-app 不会生成 public 和 src 文件夹,因此无法启动
- python - 更改多索引熊猫数据框中的值
- awk - 在 shell 脚本中增加输入变量号
- typescript - 如何将对象的每个属性都键入为字符串,除了一个?
- esp8266 - 如何在 MicroPython 中检测硬件类型(ESP32 或 ESP8266)?