如果未对用户进行身份验证以查看特定路由(例如:/admin
),则Auth会发出Boom unorthorized
错误,我希望能够重定向到/login
,但仍然返回401
HTTP statusCode
。
我们尝试了以下代码:
const statusCode = request.output.payload.statusCode;
if(statusCode && statusCode === 401) {
return reply.redirect('/login').code(statusCode);
}
重定向在我们移除.code(statusCode)
时有效,但我们 以返回401
代码客户端不是302
(重定向)
或 ......是" 最佳做法 "返回302
...?
上下文:我们正在开发一个小的(可重用的)插件来处理Hapi App / API中的错误,其中一个功能是
redirect
到/login
当auth失败时,请参阅:https://github.com/dwyl/hapi-error#redirecting-to-another-endpoint,我们希望得到它" 正确"所以其他人可以使用它!
答案 0 :(得分:4)
这是导致你悲痛的HapiJS来源(lib / response.js:320):
QScriptEngine#newActivationObject()
如您所见,使用internals.Response.prototype.redirect = function (location) {
this.statusCode = 302;
this.location(location);
this.temporary = this._temporary;
this.permanent = this._permanent;
this.rewritable = this._rewritable;
return this;
};
Hapi已经回复了302代码。您需要决定是否在前端回复401和重定向,或者使用Hapi重定向并接受它符合协议标准。
作为对最佳实践的回答,是的,Hapi正在完成服务器强制重定向(302重定向)时的预期。为了使用401响应,最佳做法是在客户端重定向,就像您只是正常导航到路由一样。
作为参考,reply.redirect()函数定义(lib / reply.js:145)只是
reply.redirect()
编辑Dec '16:下面的Kelly Milligan指出,HapiJS现在支持使用return this.response('').redirect(location);
,如果你不想要它,则不会发送302状态。