Authentication 如何不使用用户名而是使用不同的选择器登录?

Authentication 如何不使用用户名而是使用不同的选择器登录?,authentication,meteor,Authentication,Meteor,我想实现“使用用户名或customerID(决不能同时使用用户名或customerID)和密码登录”,让用户在第一个字段中输入用户名或其customerID,在第二个字段中输入密码 accounts password软件包允许我通过调用 Meteor.loginWithPassword(<username>,<password>); OR var selector = {username: <username>

我想实现“使用用户名或customerID(决不能同时使用用户名或customerID)和密码登录”,让用户在第一个字段中输入用户名或其customerID,在第二个字段中输入密码

accounts password
软件包允许我通过调用

Meteor.loginWithPassword(<username>,<password>);

                       OR

var selector = {username: <username>}
Meteor.loginWithPassword(selector, <password>);
Meteor.loginWithPassword(,);
或
变量选择器={username:}
Meteor.loginWithPassword(选择器,);
我尝试使用选择器选择用户

var selector = {customerID: <customerID>}
var选择器={customerID:}
但我似乎只能用
\u id
用户名
电子邮件
来选择一个用户,否则我会得到一个
匹配失败
错误


没有任何其他方法可以让用户在没有
用户名
\u id
电子邮件的情况下登录吗?

此解决方法是我所达到的最远的解决方法:

1.首先使用
customerID
检索
用户名
\u id
。 2.然后使用检索到的
用户名
/
\u id
和密码登录。
//服务器
流星法({
findIDFromCustomerID:函数(customerID){
user=Meteor.users.findOne({customerID:customerID});
如果(用户){
返回用户。\u id;
}否则{
抛出新流星。错误(403,“未找到用户”);
}
}
});
//客户
Meteor.call('findIDFromCustomerID',函数(err,data){
如果(数据和错误){
Meteor.loginWithPassword({id:data},);
}
});

但在这方面,我觉得我给行为不端的用户留下了一个很小的窗口。

这是我所达到的最远的解决方法:

1.首先使用
customerID
检索
用户名
\u id
。 2.然后使用检索到的
用户名
/
\u id
和密码登录。
//服务器
流星法({
findIDFromCustomerID:函数(customerID){
user=Meteor.users.findOne({customerID:customerID});
如果(用户){
返回用户。\u id;
}否则{
抛出新流星。错误(403,“未找到用户”);
}
}
});
//客户
Meteor.call('findIDFromCustomerID',函数(err,data){
如果(数据和错误){
Meteor.loginWithPassword({id:data},);
}
});

但在这方面,我觉得我给行为不端的用户留下了一个小窗口。

目前,这些是唯一允许的字段。您可以尝试在服务器上包装
login
方法,或者注册自己的登录处理程序。这并不是一件小事,因为处理程序注册没有很好的文档记录。@MasterAM,从customerID检索_id然后使用_id登录是否会造成安全问题?它本身可能不会造成安全威胁,但我不认为自己是安全专家。这是一点信息,您可能不感兴趣以这种方式公开。用户ID可能存储在其他集合中,并且对客户端可见,但是您应该考虑用户如何检索它们。一般来说,知道用户(或者,在这个问题上,任何对象)的id,不应该授予拥有该知识的人任何特权。不应将其用作共享机密。目前,这些是唯一允许使用的字段。您可以尝试在服务器上包装
login
方法,或者注册自己的登录处理程序。这并不是一件小事,因为处理程序注册没有很好的文档记录。@MasterAM,从customerID检索_id然后使用_id登录是否会造成安全问题?它本身可能不会造成安全威胁,但我不认为自己是安全专家。这是一点信息,您可能不感兴趣以这种方式公开。用户ID可能存储在其他集合中,并且对客户端可见,但是您应该考虑用户如何检索它们。一般来说,知道用户(或者,在这个问题上,任何对象)的id,不应该授予拥有该知识的人任何特权。不应将其用作共享机密。
//SERVER
Meteor.methods({
    findIDFromCustomerID: function(customerID){
        user = Meteor.users.findOne({customerID: customerID});
        if(user){
            return user._id;
        }else{
            throw new Meteor.Error(403,"User not found");
        }
    }
});

//CLIENT
Meteor.call('findIDFromCustomerID',<customerID>,function(err,data){
    if(data && !err){
        Meteor.loginWithPassword({id: data}, <password>);
    }
});