在 Meteor 中验证用户密码
Posted
技术标签:
【中文标题】在 Meteor 中验证用户密码【英文标题】:Verify user password in Meteor 【发布时间】:2013-08-15 09:18:57 【问题描述】:用户可以在我的应用中执行一些不可逆转的操作。为了增加安全级别,我想验证执行此类操作的人实际上是登录用户。我怎样才能实现它?
对于有密码的用户,我想要一个提示,要求再次输入用户密码。以后如何在不通过网络发送的情况下验证此密码?
对于通过外部服务登录的用户是否可以执行类似操作?如果是,如何实现?
【问题讨论】:
您需要一个安全系统。从这里开始:***.com/q/10099843 这完全不相关。我有一个安装了accounts-password
的工作应用程序。我不想创建一个完整的安全系统,我只想验证已经登录的用户。
【参考方案1】:
我可以帮助解决第一个问题。在撰写本文时,meteor 没有 checkPassword
方法,但您可以这样做:
在客户端,我假设您有一个表单,其中包含一个名为 password
的输入和一个名为 check-password
的按钮。事件代码可能如下所示:
Template.userAccount.events(
'click #check-password': function()
var digest = Package.sha.SHA256($('#password').val());
Meteor.call('checkPassword', digest, function(err, result)
if (result)
console.log('the passwords match!');
);
);
然后在服务器上,我们可以像这样实现checkPassword
方法:
Meteor.methods(
checkPassword: function(digest)
check(digest, String);
if (this.userId)
var user = Meteor.user();
var password = digest: digest, algorithm: 'sha-256';
var result = Accounts._checkPassword(user, password);
return result.error == null;
else
return false;
);
更多详情请看我的blog post。我会尽力保持更新。
【讨论】:
我想使用它,但由于它依赖于未记录的内部结构,这让我有点不安。您是否在生产应用中使用它? 我将它用作生产应用程序,您对此感到不安是对的——我当然会这样做。 我现在正在尝试,我得到一个“TypeError: Cannot read property 'Client' of undefined”。看起来 Meteor._srp 在最新的 Meteor 中是未定义的 :( 感谢您更新此答案,@David。我希望最终我们能找到一种独立于版本的方法。 @DavidWeldon 它不起作用(1.4 版)。尽管当前密码正确,但密码总是不正确【参考方案2】:我以前没有这样做过,但我认为你的服务器上需要这样的东西
Accounts.registerLoginHandler(function(loginRequest) 控制台日志(登录请求) var userId = null; var username = loginRequest.username; // 我不确定 METEOR 密码是如何散列的... // 所以你需要在这方面做更多的研究 // 但是让我们假设你现在拥有它 var 密码 = loginRequest.password; var user = Meteor.users.findOne( $和:[ 用户名:用户名, 密码:密码 ] ); 如果(!用户) // 错误 别的 // 已验证 );然后你可以像这样从客户端调用这个函数:
// 以某种方式获取用户名和密码 var loginRequest = 用户名:用户名,密码:密码; Accounts.callLoginMethod( 方法参数:[登录请求] );我在 github 上有一个用于不同目的的项目,但您可以了解它的结构:https://github.com/534N/apitest
希望对你有帮助,
【讨论】:
【参考方案3】:我发现验证用户密码的最佳方法是使用Accounts.changePassword
命令和
为old
和new
密码传递相同的密码。 https://docs.meteor.com/api/passwords.html#Accounts-changePassword
Accounts.changePassword(this.password, this.password, (error) =>
if(error)
//The password provided was incorrect
)
如果提供的密码错误,你会得到一个错误返回并且用户密码不会被更改。
如果密码正确,用户密码将更新为当前设置的密码。
【讨论】:
以上是关于在 Meteor 中验证用户密码的主要内容,如果未能解决你的问题,请参考以下文章