【问题标题】:How to secure Accouts.createUser() with Collection2 (server-side)如何使用 Collection 2(服务器端)保护 Accounts.create User()
【发布时间】:2015-10-23 20:21:28
【问题描述】:

我是 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 一起使用以及如何使用?

感谢一切! :)

【问题讨论】:

    标签: security meteor accounts


    【解决方案1】:

    当您调用Accounts.createUser 时,您不会向它传递一个具有在 Meteor.users 集合中找到的架构的对象。您传递具有指定字段的选项对象:

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

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

    密码字符串
    用户的密码。这不是通过网络以纯文本形式发送的。

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

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

    回调函数
    仅限客户端,可选回调。调用成功时不带参数,或失败时带单个 Error 参数。

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

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

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

    【讨论】:

    • 完美运行。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 2011-12-26
    • 2021-10-25
    • 2016-06-06
    • 2016-08-22
    • 2010-12-27
    • 2017-01-15
    • 2018-02-21
    相关资源
    最近更新 更多