Могу ли я в Hapi.js перенаправить на другую конечную точку и установить код состояния?

Если пользователь не аутентифицирован для просмотра определенного маршрута (например: /admin), аутентификация выдает ошибку 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...?

Контекст: мы разрабатываем небольшой (пригодный для повторного использования) плагин для обработки ошибок в нашем приложении/API Hapi, и одна из функций — переход с redirect на /login при сбое аутентификации. См.: https://github.com/dwyl/hapi-error#перенаправление-на-другую-конечнуюточку и мы хотим, чтобы это было "правильно", чтобы другие могли его использовать!


person nelsonic    schedule 24.08.2016    source источник
comment
Принимая во внимание добавление вашего контекста, мой ответ о передовой практике по-прежнему остается моей позицией о том, как вы должны реализовать. Ответ 401 при перенаправлении пользователя не соответствует спецификации HTTP, поскольку вы сами обрабатываете ошибку несанкционированного доступа. Честно говоря, использование 302 также неверно (Hapi должен использовать 303 See Other), но веб-сообщество приняло его так давно, что считает нормальным.   -  person gelliott181    schedule 24.08.2016


Ответы (1)


Вот источник HapiJS, который вас огорчает (lib/response.js:320):

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;
};

Как видите, с помощью reply.redirect() Hapi уже отвечает на код 302. Вам нужно будет решить, следует ли отвечать кодом 401 и перенаправлять на внешнем интерфейсе или использовать перенаправление Hapi и признать, что оно соответствует стандартам протокола.

В ответ на передовую практику, да, Hapi делает именно то, что ожидается, когда сервер вызывает перенаправление (перенаправление 302). Чтобы использовать ответ 401, лучше всего перенаправить на стороне клиента, как если бы вы просто обычно перемещались по маршруту.

Для справки, определение функции answer.redirect() (lib/reply.js:145) просто

return this.response('').redirect(location);

РЕДАКТИРОВАТЬ, декабрь 2016: Келли Миллиган ниже указала, что использование reply.redirect().code() теперь поддерживается HapiJS и не будет отправлять статус 302, если вы этого не хотите.

person gelliott181    schedule 24.08.2016