Проверка Hapi для req.user.id и идентификатора полезной нагрузки - PullRequest
0 голосов
/ 25 мая 2018

У меня простой маршрут в хапи

const handler = async(request, reply) => {
  const id = Helpers.extractUserId(request)
  const payload = request.payload
  if (payload.recipient !== id) {
    // my code....
  } else {
    return reply({ success: false, message: '_id and recipient id should not match' })
    //I want to return this from routeConfig itself
  }
}

const routeConfig = {
  method: 'POST',
  path: '/requestfriend',
  config: {
    auth:'jwt',
    validate: {
      payload: {
        recipient: Joi.string().required().error(new Error('recipient is required'))
      }
    },
    handler
  }
}

Я поставил условие для if (payload.recipient !== id), которое означает, что вошедший в систему идентификатор пользователя и получатель полезной нагрузки совпадают, тогда он должен выдать ошибку ...

Вместо того, чтобы сделать это, я хочу поместить это условие в routeConfig сам ... Итак, есть ли здесь какой-либо параметр, который можно использовать так же, как auth, validate, handler?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вы можете проверить свою полезную нагрузку с помощью опции проверки маршрута хапи Это обозначение.

validate: {
    payload: async (value, options) => {
    }
}

Вот объяснение

функция проверки с использованием асинхронной функции подписи (значение, опции), где:

value - объект request.payloadсодержит параметры запроса запроса.

options - options.

если возвращается значение, оно используется в качестве нового значения request.payload, а исходное значение сохраняется в request.orig.payload.

В противном случае полезная нагрузка остается без изменений.Если выдается ошибка, ошибка обрабатывается в соответствии с failAction.

Вот пример кода для вашего приложения, это всего лишь пример дампа, но я надеюсь, что вы можете понять идею здесь.Вы можете проверить полезную нагрузку, объект запроса и параметры индивидуально в каждом запросе.Просто передайте валидатор Joi или функцию для проверки входящих данных.

const routeConfig = {
    method: 'POST',
    path: '/requestfriend',
    config: {
        auth: 'jwt',
        validate: {
            payload: async (value, options) => {
                // extract recipient data from payload
                const {recipient} = value;
                // you can now validate your recipient
                const result = Joi.validate({recipient}, Joi.string().required().error(new Error('recipient is required')), {abortEarly: false});
                if(result.error) throw Boom.badRequest(result.error);
                // there is no request object here, you have to dig in options.context parameter
                // this is how it's look like
                // {
                //     context:
                //         {
                //             headers:
                //                 {
                //                     host: 'localhost:3009',
                //                     'user-agent': 'curl/7.54.0',
                //                     accept: '*/*',
                //                     'content-length': '13',
                //                     'content-type': 'application/x-www-form-urlencoded'
                //                 },
                //             params: {},
                //             query: {x: 'y'},
                //             auth:
                //                 {
                //                     isAuthenticated: false,
                //                     isAuthorized: false,
                //                     credentials: null,
                //                     artifacts: null,
                //                     strategy: null,
                //                     mode: null,
                //                     error: null
                //                 },
                //             app: {route: {}, request: {}}
                //         },
                //     abortEarly: false
                // }

                // let's say we got id parameters here
                const id = Helpers.extractUserId(options.context);
                if(id !== recipient) throw Boom.badRequest('_id and recipient id should not match')
            }
        },
        handler
    }
}
0 голосов
/ 25 мая 2018

Ну, это зависит от того, что вы хотите сделать ... Если вы пытаетесь аутентифицировать пользователя на основе идентификатора, я советую вам проверить соответствующую часть документа

Действительно легкореализовать:

  • Определить функцию validate на вашем сервере. js
  • Добавить опцию аутентификации в конфигурацию вашего маршрута

Если функция проверки вернуласьfalse ваша конечная точка выдаст ошибку 401.

...