2014-03-03 56 views
1

我在“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。试图推出我自己的...对流星来说全新的,它试图了解账户创建和验证是一场战斗。如果有一种方法可以用ValidateNewUser函数来做到这一点,我应该使用它吗?

谢谢你的一切帮助。

+0

你没有使用任何预建的东西?不是账户密码包? –

+0

我正在使用帐户库和帐户密码。嗨派佩!你不太会睡吗?我不应该说预先构建的东西,因为它是误导性的。编辑我的问题。 :) – user1447679

回答

0

the documentation,密码为“不通过线路发送纯文本”,所以你看在服务器端的密码字符串是不一样的什么用户输入。

编辑:至少,这是我的想法。

EDIT2:在another question中发现了一条确认它的评论。

+0

你知道我将如何验证密码服务器端?刚刚有一个想法...也许我应该在调用Accounts.createUser之前验证... – user1447679

+0

@ user1447679用户在客户端上写入的密码在发送到服务器之前总是被散列(在客户端上)。你不能在服务器上验证它;你最好的拍摄是在客户端验证它(尽管坏人可能忽略客户端上的验证规则)。 –

+0

即使我使用我自己的形式? 1.将表单值发送到服务器验证逻辑。 2.如果通过,请调用Accounts.CreateUser函数? – user1447679

1

帐号密码使用SRP,这有点复杂,所以我不会在这里完整描述它。对散列标记的实际检查发生在here附近基本上,密码没有以纯文本字符串的形式到达服务器,因此在使用SRP时,您将无法在服务器上强制执行密码策略。

也值得注意的是,在here附近,对于那些(可以理解)不想单独实施SRP的人来说,只有DDP“纯文本”登录选项。如广告所示,只有在用户连接w/SSL时才能使用。我可能会从那里开始。

与此同时,您至少可以执行一些客户端实施,直到您可以推出您的服务器端登录处理程序。

您可能还想看看这个meteorhacks article的自定义登录处理程序教程。

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

在这方面得不到重点。这只会增加额外的流量来执行检查。坏的用户仍然可以忽略检查的结果,就像他们可以管理忽略客户端检查一样。 – Season