register: async (server, options) => {
server.ext('onRequest', (request, h) => {
if (request.params) {
log.verbose(`onRequest:${request.method.toUpperCase()}:${request.path}/${request.params}`)
} else {
log.verbose(`onRequest:${request.method.toUpperCase()}:${request.path}`)
}
if (Object.getOwnPropertyNames(request.query).length) {
log.verbose(`onRequest:queryParameters: ${JSON.stringify(request.query)}`)
}
if (request.headers && request.headers['x-access-token']) {
log.verbose(`onRequest:heders:x-access-token ${JSON.stringify(request.headers['x-access-token'])}`)
}
return h.continue
})
server.ext('onPreAuth', (request, h) => {
log.verbose('onPreAuth')
return h.continue
})
server.ext('onCredentials', (request, h) => {
log.verbose('onCredentials')
return h.continue
})
server.ext('onPostAuth', (request, h, error) => {
if (request.payload) {
log.verbose(`onPostAuth:bodyPayload: ${JSON.stringify(request.payload)}`)
}
return h.continue
})
server.ext('onPreHandler', (request, h) => {
log.verbose('onPreHandler')
return h.continue
})
server.ext('onPostHandler', (request, h) => {
log.verbose('onPostHandler')
return h.continue
})
server.ext('onPreResponse', (request, h) => {
if (request && request.response && request.response.source) {
try {
log.verbose(`onPreResponse:${JSON.stringify(request.response.source)}`)
} catch (err) {
log.warn(err)
log.verbose(h.request.response.source.toString())
}
}
return h.continue
})
}
这些是Hapi LifeCycle:
OnPreResponse:在返回响应时调用。
7 onCredentials :是Hapi v17的新功能。
无法理解 onCredentials 的用途。 另外,如果我理解了hapi的生命周期,请纠正我。
答案 0 :(得分:1)
您的理解是正确的。在 OnPreAuth 和 OnPostAuth 之间添加了 onCredentials ,有关此信息很少。
新的onCredentials扩展点和更改权限的能力 在验证授权之前请求凭据。
来源:https://github.com/hapijs/hapi/issues/3658
这里多了
onCredentials:一个新的请求扩展点每个请求都与 hapi遵循预定义的路径:请求生命周期。取决于 无论您需要身份验证还是验证,该框架都会跳过 各个生命周期点。
hapi v17中有一个新的扩展点:onCredentials。这个 扩展点位于onPreAuth之后和onPostAuth之前。在 在onPreAuth上,hapi对请求进行身份验证并标识用户。的 授权是onPostAuth的一部分,例如检查请求范围 验证请求是否具有访问权限。
在onCredentials中,您可以在请求之前自定义凭据 授权。
来源:https://futurestud.io/tutorials/hapi-v17-upgrade-guide-your-move-to-async-await
这意味着您可以修改凭据对象。这是简单的示例代码。假设您要基于用户信息在身份验证后更新凭据范围。
server.ext('onCredentials', (request, h) => {
request.auth.credentials.scope = 'customadmin';
return h.continue;
});