繁体   English   中英

在 Meteor 中验证用户密码

[英]Verify user password in Meteor

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

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

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

我可以为第一个问题提供帮助。 在撰写本文时,流星还没有checkPassword方法,但是您可以按照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;
    }
  }
});

有关更多详细信息,请参阅我的博客文章 我会尽力保持最新状态。

我以前没有做过,但是我认为您的服务器上将需要这样的东西

Accounts.registerLoginHandler(function(loginRequest) {
        console.log(loginRequest)
        var userId    = null;
        var username  = loginRequest.username;
        // I'M NOT SURE HOW METEOR PASSWORD IS HASHED...
        // SO YOU NEED TO DO A BIT MORE RESEARCH ON THAT SIDE
        // BUT LET'S SAY YOU HAVE IT NOW
        var password  = loginRequest.password;

        var user = Meteor.users.findOne({
            $and: [
                {username: username},
                {password: password} 
            ]
        });
        if(!user) {
            // ERROR
        } else {
            // VERIFIED
        }
    });

那么您可以像这样从客户端调用此函数:

// FETCH THE USERNAME AND PASSWORD SOMEHOW
    var loginRequest = {username: username, password: password};

    Accounts.callLoginMethod({
        methodArguments: [loginRequest]
    });

我在github上有一个用于不同目的的项目,但是您可以了解它的结构: https : //github.com/534N/apitest

希望这可以帮助,

我发现验证用户密码的最佳方法是使用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
  }
})

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM