Невозможно достичь того, чего вы хотите, с помощью API Chrome. Chrome не предлагает никакого API для изменения запросов или других данных «на лету», как вам хотелось бы. Могу только предположить, что это, скорее всего, мера безопасности.
Однако, поскольку вы говорите, что хотите изменить данные, которые передаются и возвращаются navigaror.credentials.create()
на каком-то конкретном веб-сайте, вы можете легко сделать это с помощью скрипта содержимого, который заменяет функцию настраиваемым обработчиком и действует как прокси, перехватывая все вызовы. и, возможно, изменение данных.
Имеет ли это какой-либо смысл или нет, зависит от того, что конкретно вы хотите делать при перехвате этих вызовов. Важно отметить, что, поскольку @gcochard обращает на себя внимание в комментарии:
Весь смысл U2F/WebAuthN заключается в создании криптографически безопасной схемы запроса/ответа для строгой аутентификации в сети. Вставка прокси и изменение запроса и ответа нарушит этот криптографический запрос/ответ в любом контексте, где вы не являетесь 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
создается с использованием строкового литерала шаблона, разделенного символами `
, если вы не хотите использовать литералы шаблона, вы можете использовать массив строк, а затем присоединиться к нему. Вы также можете обратиться к этому ответу, в котором перечислены другие способы вставки кода на страницу из скрипта содержимого.
person
Marco Bonelli
schedule
12.02.2020
navigator.credentials.create
, который, в свою очередь, связывается с аппаратным токеном и возвращает ответ. Я хочу изменить запрос и ответ отnavigator.credentials.create
API, вызываемого веб-страницей. Дайте мне знать, если это не имеет никакого смысла. Я добавлю больше деталей. - person tarun14110   schedule 11.02.2020