Hqi验证req.user.id和有效负载ID

时间:2018-05-25 06:43:42

标签: node.js validation hapijs joi

我在hapi中有简单的路线

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)设置条件,这意味着登录用户的ID和有效负载收件人是相同的,然后它应该抛出错误......

我想把这个条件放在routeConfig本身...而不是这样做......所以这里可以使用任何参数,就像authvalidate,{{1 }}?

2 个答案:

答案 0 :(得分:1)

嗯,这取决于你想要做什么......如果你试图根据id验证用户,我建议你检查the relevant part of the doc

非常容易实施:

  • 在server.js
  • 中定义validate函数
  • 在路由配置中添加身份验证选项

如果验证函数返回false,您的端点将返回401错误。

答案 1 :(得分:0)

您可以使用hapi route validation options验证有效负载 这是符号。

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

以下是解释

  

使用签名异步函数的验证函数(值,   选项)其中:

     

value - 包含请求查询参数的request.payload对象。

     

选项 - 选项。

     

如果返回值,则值为   用作新的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
    }
}