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

How to secure Accouts.createUser() with Collection2 (server-side)

我是 Meteor 的新手,我有一个关于 Collection2 和 Accounts 的小问题。

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

客户端,我在服务器端创建帐户时做了一些 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.createUser 时,您不会向它传递一个具有 Meteor.users 集合中的架构的对象。您传递具有指定字段的选项对象:

Options
username String
A unique name for this user.

email String
The user's email address.

password String
The user's password. This is not sent in plain text over the wire.

profile Object
The user's profile, typically including the name field.

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

callback Function
Client only, optional callback. Called with no arguments on success, or with a single Error argument on failure.

不要为用户对象创建架构。

不过,您可以使用 Schema.UserProfile 来验证配置文件参数中传递的内容,执行此操作的最佳位置是在服务器上的 accountsServer.validateNewUser 回调中。

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