2017-01-12 1 views
0

У меня есть метод конечной точки с именем «changePassword» с http path '/: id/changePassword' внутри метода. Я нахожу учетную запись по идентификатору и обновляю атрибут пароля модели, но проблема в том, что пароль изменяется и обновляется но и токен доступа удаляется без причины.Loopback updateAttributes устанавливает пароль, удаляет токен?

Текущий код

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

Да, это новое поведение. Если весь пользовательский объект изменен (User.update и друзей) или просто пароль, все токены доступа пользователя недействительны.

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 не начинает использовать его в других местах. Прокомментируйте это и не забудьте удалить его и быть очень осторожным.

+0

Очень благодарен за ваш комментарий и фактически указал на код, ответственный за проблему, потрясающий человек. –

+0

Обратите внимание, что новая версия LoopBack ([2.37.1] (https://github.com/strongloop/loopback/releases/tag/v2.37.1)/[3.2.1] (https://github.com/ strongloop/loopback/релизы/tag/v3.2.1)) сохраняет текущий сеанс при недействительности токенов. Этого, вероятно, достаточно, чтобы решить проблему OP самостоятельно. –

Смежные вопросы