在Angular-Strongloop应用程序中更改密码的正确方法是什么?

时间:2015-08-11 00:04:20

标签: angularjs strongloop

我查看了docs,SO和interwebs,无法找到一个示例,显示如何使用Strongloop后端和使用slc生成的AngularJS API的应用程序更改用户的密码。非常欣赏正确方向的指针。

更新 我没有找到重置密码,忘记密码的情况。 我正在寻找一种合法的方式来改变旧传球以及新传球需要提供的位置,并且在设置新传球之前将验证旧传球。

2 个答案:

答案 0 :(得分:5)

无需再次登录用户,只需在用户上运行hasPassword方法即可比较密码,如果为true,则更新属性

像这样的东西...... if(user.hasPassword(req.body.oldPassword)) { user.updateAttribute('password', req.body.password .... }

https://apidocs.strongloop.com/loopback/#user-prototype-haspassword

答案 1 :(得分:1)

假设应用程序用户模型名为MyUserModel,并且继承自内置模型User

您有两种选择:

  1. 如果您只能在AngularJS /客户端工作。

    在MyUserModel上使用update远程方法(PUT请求)并指定

    { "password":"...newpassword..."}

    在体内。

    但是,为了对新密码实施安全策略,使用特定的远程方法可能比这个技巧更方便。

  2. 如果您可以在NodeJS / LoopBack服务器端工作。

    这是我的#34;完整"在LoopBack / StrongLoop - IBM项目中实现特定updatePassword远程方法的解决方案。 请确认loopback-datasource-juggler包的版本高于或等于2.45.1(npm list loopback-datasource-juggler)。

  3. "我的用户-model.js"

    module.exports = function (MyUserModel) {
    
    ...
    
    MyUserModel.updatePassword = function (ctx, emailVerify, oldPassword, newPassword, cb) {
      var newErrMsg, newErr;
      try {
        this.findOne({where: {id: ctx.req.accessToken.userId, email: emailVerify}}, function (err, user) {
          if (err) {
            cb(err);
          } else if (!user) {
            newErrMsg = "No match between provided current logged user and email";
            newErr = new Error(newErrMsg);
            newErr.statusCode = 401;
            newErr.code = 'LOGIN_FAILED_EMAIL';
            cb(newErr);
          } else {
            user.hasPassword(oldPassword, function (err, isMatch) {
              if (isMatch) {
    
                // TODO ...further verifications should be done here (e.g. non-empty new password, complex enough password etc.)...
    
                user.updateAttributes({'password': newPassword}, function (err, instance) {
                  if (err) {
                    cb(err);
                  } else {
                    cb(null, true);
                  }
                });
              } else {
                newErrMsg = 'User specified wrong current password !';
                newErr = new Error(newErrMsg);
                newErr.statusCode = 401;
                newErr.code = 'LOGIN_FAILED_PWD';
                return cb(newErr);
              }
            });
          }
        });
      } catch (err) {
        logger.error(err);
        cb(err);
      }
    };
    
    MyUserModel.remoteMethod(
      'updatePassword',
      {
        description: "Allows a logged user to change his/her password.",
        http: {verb: 'put'},
        accepts: [
          {arg: 'ctx', type: 'object', http: {source: 'context'}},
          {arg: 'emailVerify', type: 'string', required: true, description: "The user email, just for verification"},
          {arg: 'oldPassword', type: 'string', required: true, description: "The user old password"},
          {arg: 'newPassword', type: 'string', required: true, description: "The user NEW password"}
        ],
        returns: {arg: 'passwordChange', type: 'boolean'}
      }
    );
    
    ...
    };
    

    "我的用户-model.json"

    {
       "name": "MyUserModel",
       "base": "User",
    
       ...
    
       "acls": [
         ...
         {
           "comment":"allow authenticated users to change their password",
           "accessType": "EXECUTE",
           "property":"updatePassword",
           "principalType": "ROLE",
           "principalId": "$authenticated",
           "permission": "ALLOW"
         }
       ...
       ],
       ...
    }