【问题标题】:Verify user password in Meteor在 Meteor 中验证用户密码
【发布时间】:2013-08-15 09:18:57
【问题描述】:

用户可以在我的应用中执行一些不可逆转的操作。为了增加安全级别,我想验证执行此类操作的人实际上是登录用户。我怎样才能实现它?

  • 对于有密码的用户,我想要一个提示,要求再次输入用户密码。以后如何在不通过网络发送的情况下验证此密码?

  • 对于通过外部服务登录的用户是否可以执行类似操作?如果是,如何实现?

【问题讨论】:

  • 您需要一个安全系统。从这里开始:stackoverflow.com/q/10099843
  • 这完全不相关。我有一个安装了accounts-password 的工作应用程序。我不想创建一个完整的安全系统,我只想验证已经登录的用户。

标签: javascript passwords meteor user-accounts meteorite


【解决方案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
      }
    })
    

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-05
      • 2017-05-19
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多