gpt4 book ai didi

javascript - meteor :Accounts.sendVerificationEmail 自定义行为

转载 作者:行者123 更新时间:2023-11-29 19:31:26 28 4
gpt4 key购买 nike

有人可以提供在创建用户时发送电子邮件验证的正确方法吗?这是重要的部分...

a) 我希望用户在注册后可以立即访问。但是如果用户在 48 小时内还没有点击验证链接,我想拒绝他们登录,直到他们点击链接。

到目前为止,我的代码发送了一封电子邮件验证,但无论是否单击验证链接,用户都可以继续访问该应用程序(因此我的代码当然是不完整的)。

客户端.js

Template.join.events({
'submit #join-form': function(e,t){
e.preventDefault();
var firstName= t.find('#join-firstName').value,
lastName= t.find('#join-lastName').value,
email = t.find('#join-email').value,
password = t.find('#join-password').value,
username = firstName.substring(0) + '.' + lastName.substring(0),
profile = {
fullname: firstName + ' ' + lastName
};
Accounts.createUser({
email: email,
username: username,
password: password,
userType: // 'reader' or 'publisher'
createdAt: new Date(),
profile: profile
}, function(error) {
if (error) {
alert(error);
} else {
Router.go('home');
}
});
}
});

服务器.js

Meteor.startup(function () {
process.env.MAIL_URL = 'smtp://postmaster.....';
Accounts.emailTemplates.from = "no-reply@mydomain.com";
Accounts.emailTemplates.sitename = "My SIte Name";

Accounts.emailTemplates.verifyEmail.subject = function(user) {
return 'Please confirm tour Email address' ;
},
Accounts.emailTemplates.verifyEmail.text = function(user, url) {
return 'Click on the link below to verify your address: ' + url;
}
Accounts.config({
sendVerificationEmail: true
});

我的尝试是通过自己阅读 meteor 文档和查看 SO 上的其他代码来完成的。我被困住了。感谢您的支持。

最佳答案

我认为基本的想法是在 Accounts.validateLoginAttempt 中有一些验证码,你希望每次在用户登录之前检查它。你可以做的是在用户登录时存储日期和时间在 user.profile.joinDate 中更新。如果用户尝试登录

  • 检查电子邮件地址是否已验证或
  • 检查用户是否在 48 小时的宽限期内登录
isWithinGracePeriod = function(user) { 
** TBD returning true or false.
This can be tricky when you
have multiple instances in
different time-zones.
** }

Accounts.validateLoginAttempt(function(attempt){
if (attempt.user && attempt.user.emails && !attempt.user.emails[0].verified ) {
console.log('No verification action received yet.');
return isWithinGracePeriod(attempt.user);
}
return true;
});

此外,这是 HTML/空格键的内容:

<body>
{{ > start }}
</body>

<template name="start">
{{#if currentUser}}{{>showUserProfile}}{{else}}{{> login}}{{/if}}
</template>

<template name="login">
## Grab username/password here
</template>

如果创建了login模板,我们可以尝试在用户点击验证链接后抓取验证码。请注意,如果没有用户登录,则 login 将被渲染,因此我们附加到 login via

Template.login.created = function() {
if (Accounts._verifyEmailToken) {
Accounts.verifyEmail(Accounts._verifyEmailToken, function(err) {
if (err != null) {
if (err.message = 'Verify email link expired [403]') {
var message ='Sorry this verification link has expired.';
console.log(message);
alertBox = Blaze.renderWithData(Template.Alert, {message: message}, $("body").get(0));
}
} else {
var message = "Thank you! Your email address has been confirmed.";
console.log(message);
alertBox = Blaze.renderWithData(Template.Alert, {message: message}, $("body").get(0));
}
});
}
};

验证链接以“ Hook ”方式发送到 Accounts.createUser:

Accounts.onCreateUser(function(options, user) {
user.profile = {};
Meteor.setTimeout(function() {
Accounts.sendVerificationEmail(user._id);
}, 2 * 3000);
return user;
});

关于javascript - meteor :Accounts.sendVerificationEmail 自定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27247648/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com