Какова цель присвоения сообщения об ошибке req.session.error?

#javascript #express #authentication

#javascript #выразить #аутентификация

Вопрос:

В примере экспресс-аутентификации сообщение об ошибке присваивается req.session.error в случае сбоя аутентификации.

Я предполагаю, что его цель — информировать http-клиента, но я понял, что объект запроса поступает от клиента. Почему сообщение назначается там вместо объекта ответа?

Комментарии:

1. этот объект запроса является объектом HTTP-запроса. Если проверка подлинности завершается неудачно, у вас есть ошибка в request.session, а затем используйте объект ответа для перенаправления пользователя. Очистить?

2. @rags2riches извините, я не понимаю. Как http-клиент узнает, что произошла ошибка аутентификации, если сообщение назначено req.session.error ? Я вызвал ошибку из браузера, но не смог найти сообщение в ответе.

3. Если вы хотите использовать ошибку в своем ответе, вам необходимо получить к ней доступ в request.session (в примере пользователь просто присваивает новое свойство error объекту со строковым типом, ошибка), но никогда не возвращает ошибку обратно клиенту. Он просто перенаправляет его. Теперь очистить?

4. @rags2riches зачем мне нужно обращаться к ошибке req.session вместо того, чтобы напрямую назначать ее res.session ? Вы говорите, что пример аутентификации никогда не возвращает ошибку обратно клиенту, но согласны ли вы с тем, что текст сообщения явно предназначен для клиента?

5. В этом примере свойство error, присвоенное объекту сеанса запроса, предназначено только для сервера. Оно никогда не возвращается клиенту из-за перенаправления на страницу входа в систему. Ошибка вообще не привязана к объекту ответа. У вас есть точка зрения, и вы правы, спрашивая себя: «Как мы можем предупредить пользователя?» Ну, в этом примере вы этого не делаете, потому что пользователь перенаправляется только на страницу входа в систему. Нужно ли отправлять ошибку обратно пользователю?

Ответ №1:

Пакет, на который вы ссылаетесь, не возвращает ошибку аутентификации обратно клиенту. Единственным механизмом, используемым для отображения ошибки (или успеха) клиенту, является промежуточное программное обеспечение уровня приложения, которое присваивает сообщение об успехе или ошибке response.local , чтобы оно template engine могло отображать сообщение об ошибке или успехе.

Я считаю, что это код, который вызвал путаницу:

 app.use(function(req, res, next){
  var err = req.session.error;
  var msg = req.session.success;
  delete req.session.error;
  delete req.session.success;
  res.locals.message = '';
  if (err) res.locals.message = '<p class="msg error">'   err   '</p>';
  if (msg) res.locals.message = '<p class="msg success">'   msg   '</p>';
  next();
}); 
 

Это промежуточное программное обеспечение уровня приложения, которое вызывается для каждого запроса. Что это промежуточное программное обеспечение делает для каждого запроса, так это инициализирует две локальные переменные для error и success, которые являются копиями свойств ошибки и успеха сеанса запроса соответственно. Затем он удаляет эти два свойства из объекта сеанса и сбрасывает response.local.message в пустую строку. Если значение err равно true, оно присваивает ответному локальному сообщению строку, представляющую HTML-код, который отображает ошибку. В противном случае is устанавливает свойство success для элемента HTML, который template engine отображается как success для клиента.

Это не означает, что ошибка аутентификации возвращается пользователю. Пользователь перенаправляется на страницу входа в систему, и если вы протестируете это самостоятельно, вы увидите — на вкладке сети разработчиков — код состояния, равный перенаправлению (3xx).

Если вы хотите вернуть ошибку обратно клиенту, вам необходимо вернуть код состояния 401 (клиент не аутентифицирован) и отобразить, а не перенаправить на страницу входа с отображаемой ошибкой.

Комментарии:

1. Теперь я вижу, что в конечном итоге он возвращает ошибку аутентификации клиенту. Мое замешательство предполагало req.session , что оно относится к запросу, когда на самом деле оно используется для хранения и доступа к данным сеанса

2. Хорошо, первая ссылка — это промежуточное программное обеспечение уровня приложения, которое присваивает res.locals.message html-элементу с успехом или ошибкой. Затем этот элемент используется тем template engine , который отображает его клиенту. Он не возвращает пользователю ошибку аутентификации (например, 401), поскольку пользователь перенаправляется на страницу входа. Проверьте это самостоятельно и посмотрите на заголовки ответов на вкладке dev network; вы увидите код состояния, который равен 3xx, а не 401. Существует разница между возвратом ошибки аутентификации клиенту (401) и перенаправлением пользователя (3xx) с помощью элемента html, отображающего ошибку.

3. вторая ссылка — это просто счетчик просмотров. Смотрите отредактированный ответ.