在 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 命令和 为oldnew 密码传递相同的密码。 https://docs.meteor.com/api/passwords.html#Accounts-changePassword

Accounts.changePassword(this.password, this.password, (error) => 
  if(error) 
    //The password provided was incorrect
  
)

如果提供的密码错误,你会得到一个错误返回并且用户密码不会被更改。

如果密码正确,用户密码将更新为当前设置的密码。

【讨论】:

以上是关于在 Meteor 中验证用户密码的主要内容,如果未能解决你的问题,请参考以下文章

使用 Meteor 和 Mailgun 恢复密码

wincc用户管理修改密码不用验证

如何验证firebase用户当前密码

如何在用户名/密码和谷歌登录中验证和授权用户?

如何在 Meteor React 中加密和解密客户端上的数据?

怎样验证jsp页面输入的用户名与密码和数据库中的一致?