Meteor - 如何使用密码上的服务器端验证

时间:2014-03-03 05:12:29

标签: javascript meteor

我正在“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函数来代替吗?

感谢您的帮助。

3 个答案:

答案 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中找到了确认的评论。