我对Hapi处理验证的方式感到有些困惑,根据请求生命周期(http://hapijs.com/api#request-lifecycle),params / queries的验证只在验证完成后才会发生。
这样做有意义吗?例如,我正在使用公共API,但如果请求参数无效,我不想通过所有身份验证逻辑。
使用以下验证说出请求:
validate: {
name: Joi.string().required()
}
为什么当请求因name
未被发送而无效时,API会遇到验证用户身份的麻烦?
或者这只是误解了请求生命周期?
答案 0 :(得分:3)
验证失败时,hapi会返回有关原因验证失败的信息。在您的示例中,路由需要一个名为name
的参数。出于安全原因,您可能不希望告知未经身份验证的用户此路由需要此参数。这给了很多信息吗?
就我个人而言,我认为首先进行身份验证有几个原因:
更重要的是,告诉用户他们无权访问端点,或者他们的请求无效?我认为授权更重要。
出于安全原因,请勿披露超出绝对必要的信息。
建立您的身份验证方法后,"工作量"验证请求是相同的,但验证可以在请求之间变化很大。一条路线可能有许多需要验证的参数。因此,如果您不得不平均失败请求的成本,那么身份验证可能会比许多请求更便宜。 (参见JWT认证)