Javascript 通过电子邮件向expressJS确认注册
我已经在expresJS中设置了一个用户填写表单,然后它进入一个注册路径,该路径经过以下步骤:Javascript 通过电子邮件向expressJS确认注册,javascript,express,passport.js,Javascript,Express,Passport.js,我已经在expresJS中设置了一个用户填写表单,然后它进入一个注册路径,该路径经过以下步骤: 验证数据(清理电子邮件和用户名) 注册(如果数据有效,则将用户保存到数据库) 登录(使用passportJS) 该路线的代码: router.post('/register', userController.validateRegister, userController.register, authController.login ); 问题是,我不想直接注册用户。 我想给他们发送一封
router.post('/register',
userController.validateRegister,
userController.register,
authController.login
);
问题是,我不想直接注册用户。
我想给他们发送一封电子邮件,然后当点击链接时,它实际上会注册他们
我猜这样做的方法是不在我的注册路径(注册)中使用步骤2,而是向用户发送一封包含链接的电子邮件以完成注册,然后当用户单击链接时,我注册并登录他们
所以我想,如果我删除register方法,我可以跳到login方法,解决在用户中登录而不注册的问题(不注册)
将其保存到数据库中)
但是当我提交表单时,我得到了一个错误:
登录失败代码>
它来自于登录方法:
exports.login = passport.authenticate('local', {
failureRedirect: '/login',
failureFlash: 'Failed Login!',
successRedirect: '/',
successFlash: 'You are now logged in!'
});
所以,我有点迷失了,如何改变我目前的设置,我在现场注册他们,他们必须点击我发送给他们的电子邮件
以下是im在注册路由中使用的方法:
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的配置如下:
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
用户未注册时为什么要登录?
默认情况下,您可以将用户模型设置中的布尔属性(如isVerified
)添加到false
。
仅允许isVerified
属性设置为true
的用户进行登录过程
当用户单击注册电子邮件中包含的链接时,您可以将isVerified
设置为true
,用户可以自由登录。
这样,您就可以在注册期间运行register方法
当用户提交注册表时,没有理由立即登录。
您可以呈现一个信息页面,通知用户一封帐户验证
电子邮件已发送到他的电子邮件帐户。是的。。。我改变了原来的问题,因此不需要立即记录用户。我觉得你的解决方案很好!对我来说也更容易,那么我该怎么做呢?我注册用户,然后发送一封电子邮件,其中包含一个带有令牌的链接和电子邮件?然后当用户点击链接时,它会把他带到一条将标志改为正数的路线?你是这样想的吗?非常感谢!是的,您可以添加一个用户属性verifyToken
,在注册过程中可以为每个用户分配一个随机生成的值。通过电子邮件发送给用户的链接应包含该令牌。然后,当用户单击链接时,您可以验证令牌并验证用户。