我正在“Accounts.onCreateUser”函数中执行服务器端验证,以便我也可以传递选项对象。我无法弄清楚如何使用验证用户功能。
首先,如果我走向错误的方向,我会完全公开,所以请指教。 我无法弄清楚如何验证服务器端的密码长度。是因为它在创建之前已经转换了吗?测试时,如果我输入一个字符的密码,它不会引发错误。
Accounts.onCreateUser(function (options, user) {
if (options.profile) {
user.profile = options.profile;
user.profile.user_status = "new user";
}
// Error checking
var errors = "";
if (user.username.length === 0) {
errors = errors + '<li>Email is required</li>';
}
if (user.username.length !== 0 && user.username.length < 4) {
errors = errors + '<li>Email too short</li>';
}
if (user.profile.firstname.length === 0) {
errors = errors + '<li>First name is required</li>';
}
if (user.profile.firstname.length !== 0 && user.profile.firstname.length < 2) {
errors = errors + '<li>First name is too short</li>';
}
if (user.profile.lastname.length === 0) {
errors = errors + '<li>Last name is required</li>';
}
if (user.profile.lastname.length !== 0 && user.profile.lastname.length < 2) {
errors = errors + '<li>Last name is too short</li>';
}
if (user.services.password.length === 0) {
errors = errors + '<li>Please enter a password</li>';
}
if (user.services.password.length < 7) {
errors = errors + '<li>Password requires 7 or more characters</li>';
}
if (errors) {
throw new Meteor.Error(403, errors);
} else {
return user;
}
});
我没有使用Accounts-ui。试图推出我自己的...作为Meteor全新的尝试了解帐户创建和验证是一场战斗。如果有一种方法可以使用ValidateNewUser函数来代替吗?
感谢您的帮助。
答案 0 :(得分:2)
我已经找到了执行此操作的最佳方式。希望这会对其他人有所帮助。
我正在服务器端使用一种方法来验证并返回错误(如果有的话)。然后继续创建帐户。
Meteor.call('Validate_Registration', email, password, cpassword, firstname, lastname, terms, function(error) {
if (error) {
error = error.reason;
$('#Error-Block').fadeIn().children('ul').html(error);
console.log(error);
} else {
Accounts.createUser({
username: email,
email: email,
password: password,
profile: {
firstname: firstname,
lastname: lastname
}
}, function(error) {
if (error) {
error = error.reason;
$('#Error-Block').fadeIn().children('ul').html(error);
} else {
var uid = Accounts.connection.userId();
Meteor.call('Verify_Email', uid, email);
Router.go('/email-instructions');
}
});
}
});
目前我唯一不确定的是使用它是否正确:
var uid = Accounts.connection.userId();
这似乎只对当前用户来说是本地的,并且存储在本地存储中给用户。
答案 1 :(得分:1)
帐户密码使用SRP,这有点复杂,所以我不会在这里完整描述。散列令牌的实际检查发生在here左右。基本上,密码不会作为纯文本字符串到达服务器,因此在使用SRP时,您将无法在服务器上强制实施密码策略。
另外值得注意的是here左右,对于那些(可以理解)不想自己实施SRP的人来说,只有DDP“明文”登录选项。正如所宣传的那样,只有在用户与SSL连接时才能使用它。我可能会从那里开始。
与此同时,您至少可以执行一些客户端强制执行,直到您可以推送服务器端登录处理程序。
您可能还想查看此meteorhacks article以获取自定义登录处理程序教程。
答案 2 :(得分:0)
根据the documentation,密码“不是通过网络以纯文本形式发送的”,因此您在服务器端查看的密码字符串与用户输入的密码字符串不同。 / p> 编辑:至少,这就是我的想法。
EDIT2:在another question中找到了确认的评论。