Удалить значение заголовка авторизации из ответа на ошибку Axios

#javascript #axios

Вопрос:

Я отправляю HTTP-запрос с помощью Axios, что приводит к ошибке. Когда я печатаю объект ошибки, он печатает запрос, включая секрет в заголовке авторизации.

Напр.

 axios.get('https://test.com/404', { headers: { Authorization: 'secret' } }).catch(err => console.log(err));
 

Это выведет секрет в сообщении журнала в нескольких местах:

 Error: Request failed with status code 463
    at createError (/code/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/code/node_modules/axios/lib/core/settle.js:17:12)
    at IncomingMessage.handleStreamEnd (/code/node_modules/axios/lib/adapters/http.js:236:11)
    at IncomingMessage.emit (events.js:215:7)
    at IncomingMessage.EventEmitter.emit (domain.js:475:20)
    at endReadableNT (_stream_readable.js:1184:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  config: {
  ...
    url: 'https://test.com/404',
    method: 'get',
    headers: {
      Accept: 'application/json, text/plain, */*',
      Authorization: 'secret',
      'User-Agent': 'axios/0.19.2'
    },
  },
  ...
  request: ClientRequest {
    _header: 'GET /404 HTTP/1.1rn'  
      'Accept: application/json, text/plain, */*rn'  
      'Authorization: secretrn'  
      'User-Agent: axios/0.19.2rn'  
      'Host: www.test.comrn'  
      'Connection: closern'  
      'rn',
  },
  ...
  response: {
    ...
    request: ClientRequest {
      _header: 'GET /404 HTTP/1.1rn'  
        'Accept: application/json, text/plain, */*rn'  
        'Authorization: secretrn'  
        'User-Agent: axios/0.19.2rn'  
        'Host: www.test.comrn'  
        'Connection: closern'  
        'rn',
    },
  },
}
 

Я не хочу печатать свой секрет в сообщении журнала.
Есть ли способ избежать этого?

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

1. Это всего лишь знак. Вы не раскрываете ничего такого, к чему у клиента еще нет доступа.

2. В моем случае это базовый заголовок аутентификации, который включает пароль в кодировке base64. Я не хочу печатать пароль в журнале, так как журнал доступен пользователям и процессам, которые не должны иметь доступа к паролю с открытым текстом

3. Пользователь всегда может взглянуть на заголовки запроса и увидеть то же самое.

4. о каком «Пользователе» вы говорите?

5. Кто бы ни отправлял запрос.

Ответ №1:

В итоге я использовал перехватчики

 axios.interceptors.response.use(_.identity, (error) => {
  delete error.config.headers.Authorization;
  delete error.request._header;
  return Promise.reject(error);
});
 

Это связано с внутренними объектами axios, поэтому они хрупкие и могут сломаться, но на данный момент это решает мою проблему.

Ответ №2:

Это не модно, но почему бы просто не запустить регулярное выражение над сообщением, прежде чем выводить его?

 const ReRemoveSecret = new RegExp('secret', 'g');

.catch(msg => {
  console.log(msg.replace($ReRemoveSecret, ''));
});