#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, ''));
});