node.js - Meteor.loginWithPassword 不适用于带有 @ 字符的用户名
问题描述
我在数据库中有一个具有以下凭据的用户:
{
"_id": "zTHv8yqPSm3pmi4So",
"emails": [{"address": "someemail@example.com", "verified": true}],
"services" : {
"password" : {
"bcrypt" : "$2b$10$L6HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo1IjZEx6.PBxfOeQHqS."
},
"resume" : {
"loginTokens" : [ ]
}
},
"username": "some@username",
"profile": {
"firstName": "Example",
"lastName": "User",
}
}
当我尝试使用用户名登录用户时,它说找不到用户:
Meteor.loginWithPassword("some@username", "123456", function(error) {
console.log(error.reason);
});
它适用于电子邮件,但不适用于用户名。
我希望灵活地使用电子邮件或用户名登录用户
解决方案
APIMeteor.loginWithPassword
实际上将“选择器”作为第一个参数:
https://docs.meteor.com/api/accounts.html#Meteor-loginWithPassword
Meteor.loginWithPassword(selector, password, [callback])
论据
selector
对象或字符串解释为用户名或电子邮件的字符串;或具有单个键的对象:
username
或id
.
在您的情况下,您使用字符串形式,并让 Meteor 尝试猜测它是用户名还是电子邮件。
但由于您的用户名包含“@”字符,这会误导 Meteor 将其解释为电子邮件:
Meteor.loginWithPassword = (selector, password, callback) => {
if (typeof selector === 'string')
if (!selector.includes('@'))
selector = {username: selector};
else
selector = {email: selector};
这就是为什么当您尝试使用电子邮件时它可以正常工作,但对于包含“@”的用户名却失败了。
简单的解决方案是明确告诉 Meteor 你的目标是用户名(而不是电子邮件,尽管有“@”):
Meteor.loginWithPassword({
username: "some@username"
},
"123456",
function(error) {
console.log(error.reason);
}
);
现在,如果我想进一步猜测您的目标,您希望您的用户能够提供他们的电子邮件或用户名作为登录标识符,而无需明确告诉它是哪个?(就像一种“全能”登录 id 输入)
在这种情况下,不幸的是,您将不得不检测自己是电子邮件还是用户名。如果后者确实遵循“some@username”之类的模式,您可以尝试检测域不完整(无扩展名)。
但是,如果您的任何用户确实注册了一个看起来像电子邮件的用户名(例如“some@user.name”),那么您可能无法区分它们。
更糟糕的是,一些用户可能选择的用户名正是另一个用户的电子邮件地址!在那种情况下,如何判断哪个人正在尝试登录?
恕我直言,这对于略微改进的用户体验来说会变得很麻烦。要么阻止包含“@”的用户名,即强制执行一个规则,使您能够区分,或者提供一种方法让用户在不明确时明确判断它是电子邮件还是用户名(例如,它可以是一些无线电来判断哪个输入它;当登录 ID 明确时,它仍然可以包含“自动”模式)。
顺便说一句,我们还可以想象执行 2 步登录尝试:首先按原样,然后如果用户名包含“@”,则显式地作为用户名,如上所述。但是我们仍然可能陷入上述最坏的情况......
推荐阅读
- c++ - 为什么在这种情况下 seekp() 失败?
- c# - 进入控制台时,对象列表无法准确传递给 mvc 控制器
- linux - Awesome WM - Chatty(Java 应用程序)绕过来自 rc.lua 的维度属性
- php - 如何等待 mysqli_multi_query 解决?
- html - SVG 没有正确渲染
- javascript - 带有javascript dinamics的mvc视图上的搜索栏
- c# - 如何 Json DeserializeObject 指定类型的字符串
- ios - 滑动关闭时输入附件视图不粘在键盘上
- ios - 升级到 React Native 0.63.2 时出现黄框错误
- node.js - 使用 Nodejs Zlib 压缩从 Multer 上传的文件