Loopback updateAttributes设置密码是否删除令牌?

时间:2017-01-12 11:32:11

标签: loopbackjs

我得到了一个名为' changePassword'的端点方法。使用http路径' /:id / changePassword'在方法内部,我通过id找到帐户并更新模型的密码属性,但问题是密码确实更改并得到更新,但访问令牌也无缘无故被删除。

当前代码

instance.hasPassword(data.oldPassword, function(err, isMatch) {
    if (isMatch) {
        instance.updateAttributes({'password': data.password}, function(errUpdateAccount, updatedAccount) {
            if (!errUpdateAccount) {
                return cb(null, {
                    status: 200
                });
            } else {
                return cb(errUpdateAccount);
            }
        });
    }
});

1 个答案:

答案 0 :(得分:1)

是的,这是新行为。如果更改了整个用户对象(User.update和friends),或者仅更改了密码,则所有用户访问令牌都将失效。

Here's the what one of the project collaborators said regarding it

  

出于安全原因,注销用户很重要。考虑这个案子   当有人破解你在注册时使用的电子邮件时   LoopBack驱动的应用程序。找到后,您将登录该应用程序   将电子邮件更改为未被黑客攻击的其他电子邮件。没有   会话(访问令牌)失效,攻击者将保持记录状态   进入您的帐户,您将无法如何注销它们。

     

话虽如此,我同意这会降低用户体验   最佳。我建议允许最终用户决定他们是否   想要注销其他会话,请参阅#3071

现在只有一个未解决拉动请求的问题(#3071)。对此没有干净的解决方法。

如果你真的非常渴望有一个解决方案,那么你可以修补环回:

我查看了代码,找到了this part is responsible for it,它调用了User._invalidateAccessTokensOfUsers。由于我haven't found项目中的任何其他地方使用此函数,我想你可以做一个冒险的举动来覆盖它什么都不做:

app.models.User._invalidateAccessTokensOfUsers = (ids, cb) => process.nextTicke(cb);

这是解决此问题(#3071)之前解决问题的最佳方法。请注意,您应该确保您的代码和依赖项也不使用_invalidateAccessTokensOfUsers,并且loopback也不会在其他地方开始使用它。评论它并且不要忘记删除它并且要非常小心。