在Meteor中存储待处理用户密码的安全方式

时间:2015-03-05 22:07:25

标签: meteor passwords

对于我的Meteor应用程序,我希望有以下注册过程:

  1. 用户注册用户名,电子邮件和密码(他还无法登录。)
  2. 已发送确认电子邮件[Accounts.sendEnrollmentEmail]
  3. 用户确认电子邮件[Accounts.onEnrollmentLink]
  4. 用户已创建。 [Accounts.createUser] (他能够登录。)
  5. 为了实现这一点,我觉得我必须将纯文本密码存储在临时用户的表中(步骤1),以便稍后创建实际用户(步骤3) 。显然这是一个可怕的想法。

    我当然只能在步骤3中询问密码并立即创建用户 - 但这不是我想要实现的行为。

    那么:是否有一种正确的方法来安全地存储密码以便以后将其传递给用户创建?或者有没有办法创建一个不可登录的用户?

2 个答案:

答案 0 :(得分:2)

当您使用内置方法创建用户时,Meteor会为您提供保存密码存储所需的一切,因此您无需做太多事情。所以你应该从头开始使用这些方法(你的步骤1:Accounts.createUser,步骤2:Accounts.sendVerificationEmail,步骤3:Accounts.verifyEmail,不再需要步骤4。

现在要想到达你想去的地方,你可以使用David Weldon建议的方法,但在服务器端使用Accounts.validateLoginAttempt。这有点容易,首先不允许登录。

例如,您可以使用此代码服务器端:

Accounts.validateLoginAttempt(function(loginAttempt){
    if (!loginAttempt.allowed) {
        // Only tell the user that something went wrong but not what to enhance security
        throw new Meteor.Error(901, 'Your login credentials are wrong. Try again.');
    } else {

        // In some cases this method isn't invoked with a correct user object...
        if (!loginAttempt.user) {
            throw new Meteor.Error(902, 'No valid user object. Make sure to validate your email address first.');
        }

        // If email verification is required check if the user has a valid email address and don't allow the login if he has none
        if (!loginAttempt.user.emails[0].verified) {
            throw new Meteor.Error(902, 'Your email address has to be verified first.');
        }

        // We have a correct login!
        return true;
    }
});

现在在客户端,您可以使用这样的逻辑进行登录

Meteor.loginWithPassword(email, password, function(callback) {
    if (callback === undefined) { 
        // Your login logic
    } else if (callback.error == 902) {
        // Your "not verfied" logic
    } else {
        // Your other login errors logic
    }
}

请注意,您可能还需要稍微调整注册过程,因为Meteor默认尝试在注册后直接登录用户,但这将不再可能。 另请注意,您不仅可以使用Accounts.validateLoginAttempt。例如,您还可以在此处实现一个逻辑,仅允许来自同一IP的一定数量的错误登录尝试。

答案 1 :(得分:1)

我们根据帐户包

在我们的应用中使用了略有不同的模式
  1. 用户注册
  2. 用户正常登录
  3. 输出主网站模板条件内容

    <template name="main">
      {{#if currentUser}}
        {{#if verified }}
          ...
        {{else}}
          Notice to user to look for their verification email
        {{/if}}
      {{/if}}
    </template>
    

    基于辅助函数

     Template.main.helpers({
       verified: function() { return Meteor.user().emails[0].verified; }
     });
    

    这符合以下要求:用户无需做任何事情,直到他们经过验证,然后以简单安全的方式使用帐户包。

    我可以看到使用铁:路由器采取相关的方法。