如何使用Collection2(服务器端)保护Accouts.createUser()

时间:2015-10-23 20:21:29

标签: security meteor accounts

我是Meteor的新手,我对Collection2和Accounts有一点疑问。

目前,用户可以创建帐户。这由调用Meteor方法的Template事件(客户端)处理。此方法在客户端和服务器端定义。

客户端,我做了一些UI的东西(没什么重要的),而服务器端我正在创建帐户。

这是我的服务器端Meteor方法:

Meteor.methods({

    'registerUser': function (user) {
        Accounts.createUser(user);
    }

});

我还使用Collection2包在插入或更新文档之前检查数据:

Schema = {};

Schema.UserProfile = new SimpleSchema({
    name: {
        type: String,
        optional: false,
        label: "Name"
    }
});

Schema.User = new SimpleSchema({
    username: {
        type: String,
        optional: true,
        label: "Username"
    },
    emails: {
        type: Array,
        optional: true
    },
    "emails.$": {
        type: Object
    },
    "emails.$.address": {
        type: String,
        regEx: SimpleSchema.RegEx.Email,
        label: "Email address"
    },
    "emails.$.verified": {
        type: Boolean
    },
    createdAt: {
        type: Date
    },
    profile: {
        type: Schema.UserProfile,
        optional: true
    },
    services: {
        type: Object,
        optional: true,
        blackbox: true
    }
});

Meteor.users.attachSchema(Schema.User);

好的,我在这里。我的问题是在创建用户(服务器端)时获取Collection2返回的潜在错误。像这样:

Meteor.methods({

    'registerUser': function (user) {
        Accounts.createUser(user, (err, res) => {
            if(err) return err;
        });
        return true;
    }

});

但Meteor不支持Accounts.createUser()的回调。因此,即使我使用Collection2,我的用户也可以提交错误的输入。

问题是:在这种情况下是否可以将Collection2与Accounts一起使用以及如何使用?

谢谢你的一切! :)

1 个答案:

答案 0 :(得分:0)

当您调用Accounts.createUser时,您不会将其传递给具有Meteor.users集合中的模式的对象。您传递具有指定字段的选项对象:

  

选项
  用户名字符串
  此用户的唯一名称。

     

电子邮件字符串
  用户的电子邮件地址。

     

密码字符串
  用户的密码。这不是通过电汇以纯文本发送的。

     

个人资料对象
  用户的个人资料,通常包括姓名字段。

从客户端调用此方法确实有回调:

  

回调功能
  仅限客户端,可选回调。在成功时没有参数调用,或者在失败时使用单个Error参数调用。

不要为User对象创建Schema。

您可以使用Schema.UserProfile来验证在profile参数中传递的内容,并且最好的位置是在服务器上的accountsServer.validateNewUser回调内。

Accounts.validateNewUser(function (user) {
  if(Match.test(user.profile, Schema.UserProfile))
    return true;
  throw new Meteor.Error(403, "Invalid UserProfile");
});