Невозможно достичь того, чего вы хотите, с помощью Chrome API. Chrome не предлагает никаких API-интерфейсов для изменения запросов или других данных «на лету», как вы бы хотели. Я могу только предположить, что это, скорее всего, мера безопасности.
Однако, поскольку вы говорите, что хотите изменить данные, которые передаются и возвращаются navigaror.credentials.create()
на каком-то конкретном веб-сайте, вы можете легко это сделать. со скриптом содержимого, который заменяет функцию пользовательским обработчиком и действует как прокси, перехватывая все вызовы и потенциально изменяя данные.
Имеет ли это какой-либо смысл или нет, зависит от того, что конкретно вы хотите делать при перехвате этих звонки. Важно отметить, что, поскольку @ gcochard заставляет нас заметить в комментарии:
Весь смысл U2F / WebAuthN состоит в том, чтобы создать криптографически безопасную схему запроса / ответа для строгой аутентификации через Интернет. Вставка прокси-сервера и изменение запроса и ответа нарушит эту криптографию c вызов / ответ в любом контексте, где вы не являетесь MITM, и ваши пользователи будут зависеть от вашего расширения для аутентификации. Это может помочь объяснить, что вы пытаетесь сделать с этими данными.
В любом случае, вы все равно можете регистрировать и получать доступ к данным, так что может быть значимым применением эта стратегия.
Я только обрисую, что должен делать скрипт контента, если вы также не знаете, как внедрить скрипт контента на страницу, обратитесь к этой странице документации . В любом случае вы хотите, чтобы ваш сценарий запускался как можно скорее , поэтому убедитесь, что у вас есть "run_at": "document_start"
.
Сценарий содержимого будет выполнять следующее:
- Создайте тег
<script>
внутри страницы, загружая в него некоторый код, который будет: - Сохранить метод
create()
для navigator.credentials
в другой переменной. - Заменить оригинальный метод
create()
с функцией, которая «фильтрует» сделанные ему вызовы и внутренне вызывает реальный метод.
Итак, вот простой скрипт содержимого, который достигает вашей цели:
const code = `
const real_create = navigator.credentials.create.bind(navigator.credentials);
navigator.credentials.create = function() {
// Modify the arguments how you want.
console.log(arguments);
// Call the real method with the modified arguments.
let res = real_create.apply(arguments);
// Modify the return value how you want, then return it.
console.log(res);
return res;
}
`;
const script = document.createElement('script');
script.textContent = code;
(document.documentHead || document.documentElement).appendChild(script);
script.remove();
Вышесказанное должно делать именно то, что вы хотите, это всего лишь вопрос вставки его на нужную страницу.
ПРИМЕЧАНИЕ: переменная code
создается с использованием строкового литерала шаблона, разделенного символами `
, если вы не хотите использовать литералы шаблона, вы можете использовать массив строк и затем присоединиться к нему. Вы также можете обратиться к этому ответу , в котором перечислены другие способы внедрения кода на страницу из сценария содержимого.