Как настроить пользовательский HashPassword в аутентификации Feathersjs - PullRequest
0 голосов
/ 31 января 2019

Я замечаю в документации feathersjs

hashPassword Этот хук используется для хеширования паролей в виде простого текста перед их сохранением в базе данных.Он использует алгоритм bcrypt по умолчанию, но его можно настроить, передав собственную функцию options.hash.

Как применить эту пользовательскую функцию в перехвате js перьев, перехвате hashPassword?

const { authenticate } = require('@feathersjs/authentication').hooks;

const {
  hashPassword, protect
} = require('@feathersjs/authentication-local').hooks;


module.exports = {
  before: {
    all: [],
    find: [ authenticate('jwt') ],
    get: [ authenticate('jwt') ],
    create: [ hashPassword() ],
    update: [ hashPassword(),  authenticate('jwt') ],
    patch: [ hashPassword(),  authenticate('jwt') ],
    remove: [ authenticate('jwt') ]
  },

  after: {
    all: [ 
      // Make sure the password field is never sent to the client
      // Always must be the last hook
      protect('password')
    ],
    find: [],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  },

  error: {
    all: [],
    find: [],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  }
};

У кого-нибудь есть ответ?

Спасибо

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Вы можете передать объект hashPassword, который они называют options.Опции могут иметь два поля: passwordField и hash.

...    
create: [ hashPassword({passwordField: 'password', hash: hasherFunc}) ]
...
0 голосов
/ 29 мая 2019

Используйте саму библиотеку перьев.Это самый простой и самый надежный на данный момент.

const hash = require("@feathersjs/authentication-local/lib/utils/hash");

await hash(req.body.password).then(result => { // Do anything });
0 голосов
/ 02 марта 2019

Похоже, что это не работает, по крайней мере, с текущей версией 1.2.9 @ feathersjs / authentication-local.

В verifyier.js вы увидите:

 // stuff omitted
_comparePassword (entity, password) {

 return new Promise((resolve, reject) => {
      bcrypt.compare(password, hash, function (error, result) {
        // Handle 500 server error.
        if (error) {
          return reject(error);
        }

        if (!result) {
          debug('Password incorrect');
          return reject(false); // eslint-disable-line
        }

        debug('Password correct');
        return resolve(entity);
      });
    });
  }

Таким образом, верификатор по умолчанию всегда использует жестко закодированный bcrypt.compare, а не предоставленную хеш-функцию.

Единственное решение, которое я нашел, - расширить Verifier и переопределить _comparePassword.Тогда: app.configure(local({ Verifier: MyCustomVerifier })); будет работать.

...