1

我在用户服务中创建了一个后挂钩,它应该清理“查找”方法的响应,它破坏了身份验证服务。

after hook sanitizeResponse应该验证查询是否与电子邮件或 cpf 有关,如果是,则应删除一些字段并添加一些新字段。

这是users.hooks.js

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

const {
  // eslint-disable-next-line no-unused-vars
  hashPassword, protect
} = require('@feathersjs/authentication-local').hooks;

const sanitizeResponse = (context) => {
  const query = context.params.query;
  if(!query.email && !query.cpf)
    return context;
  
  if(context.result.total){
    context.result.data[0] = {exists: 1, id: context.result.data[0].id};
  }else{
    context.result.data[0] = {exists: 0};
  }
};

module.exports = {
  before: {
    all: [],
    find: [authenticate('jwt')],
    get: [ authenticate('jwt') ],
    create: [ hashPassword('password') ],
    update: [ hashPassword('password'),  authenticate('jwt') ],
    patch: [ hashPassword('password'),  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: [sanitizeResponse],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  },

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

在编写这个钩子之前,身份验证过去工作得很好,但之后它开始向我发送“未通过身份验证”的响应。

我没有更改由 feathersjs-cli 生成的 user.class.js 和 authentication.js 文件中的任何内容。

我想知道我做错了什么?有没有更好的方法来清理响应?

感谢你们对我的帮助!

4

1 回答 1

1

身份验证流程需要能够检索完整的用户信息以将其添加到请求、比较密码等。您可能希望跳过sanitizeResponse 内部调用的钩子(何时context.params.providerundefined

const sanitizeResponse = (context) => {
  const query = context.params.query;
  if(!context.params.provider || (!query.email && !query.cpf))
    return context;
  
  if(context.result.total){
    context.result.data[0] = {exists: 1, id: context.result.data[0].id};
  }else{
    context.result.data[0] = {exists: 0};
  }
};
于 2020-09-03T18:05:06.933 回答