如何在Feathersjs Authentication中创建自定义HashPassword函数



我在feathersjs文档中注意到

hashPassword 此钩子用于在之前对纯文本密码进行哈希处理 它们将保存到数据库中。它使用 bcrypt 算法 默认,但可以通过传递您自己的选项进行自定义。 功能。

如何在羽毛js钩子,哈希密码钩子中应用此自定义函数?

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: []
  }
};

有人知道答案吗?

谢谢

这似乎不起作用,至少在当前版本的 @feathersjs/authentication-local 中是这样。

在验证程序.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,而不是任何提供的哈希函数。

我找到的唯一解决方案是扩展验证程序并覆盖_comparePassword。然后:app.configure(local({ Verifier: MyCustomVerifier }));将起作用。

您可以将对象传递给他们称之为options hashPassword。选项可以有两个字段:"passwordField"和"hash"。

...    
create: [ hashPassword({passwordField: 'password', hash: hasherFunc}) ]
...
你可以

这样做

//in your hook
const bcrypt = require("bcrypt");
module.exports = (options = {}) => {
  return async (context) => {
    const salt = await bcrypt.genSalt(10);
    const pass = context.data.password;
    const hashed = await bcrypt.hash(pass, salt);
    context.data.password = hashed
  }
}

然后你必须删除/services/users中的其他哈希函数

使用羽毛库本身。这是目前最简单,最可靠的一个。

const hash = require("@feathersjs/authentication-local/lib/utils/hash");
await hash(req.body.password).then(result => { // Do anything });

相关内容

  • 没有找到相关文章

最新更新