用户可以在我的应用中执行一些不可逆转的操作。为了增加安全级别,我想验证执行此类操作的人员实际上是登录用户。我怎样才能实现它?
对于有密码的用户,我想要一个要求再次输入用户密码的提示。如何在不通过网络发送密码的情况下验证密码?
通过外部服务登录的用户是否可以采取类似的操作?如果是的话,如何实现呢?
答案 0 :(得分:19)
我可以帮助解决第一个问题。在撰写本文时,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。我会尽力保持最新状态。
答案 1 :(得分:0)
我之前没有这样做,但我认为你的服务器上需要这样的东西
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
希望这有帮助,