#feathersjs #feathers-sequelize #feathers-authentication #feathers-hook #feathers-service
#feathersjs #feathers-продолжить #feathers-аутентификация #feathers-крюк #feathers-service
Вопрос:
Я создал в службе пользователей перехват after, который должен очистить ответ от метода «find», и это нарушило службу аутентификации.
После перехвата 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 amp;amp; !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: []
}
};
До написания этого перехвата аутентификация работала просто отлично, но после этого она начала отправлять мне ответы «Не прошедший проверку подлинности».
Я ничего не изменил в user.class.js и authentication.js файл, сгенерированный feathersjs-cli.
Я хотел бы знать, что я делаю не так? Есть ли лучший способ очистить ответ?
Спасибо, что помогли мне!
Ответ №1:
Поток аутентификации должен иметь возможность извлекать полную информацию о пользователе, чтобы добавлять ее в запросы, сравнивать пароли и многое другое. Вероятно, вы захотите пропустить sanitizeResponse
перехват для внутренних вызовов (когда context.params.provider
есть undefined
):
const sanitizeResponse = (context) => {
const query = context.params.query;
if(!context.params.provider || (!query.email amp;amp; !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};
}
};
Комментарии:
1. Спасибо, что помогли мне, ваше объяснение было действительно полезным!