Как заменить параметры запроса или ответа navigator.credentials.create через расширение Chrome?

Я работаю над расширением Chrome для изменения параметров запроса создания U2F из веб-службы. Можно ли заменить navigator.credentials.create параметры запроса или ответа через расширение Chrome? Я не мог найти ресурсы, связанные с этим. Любые указатели будут полезны.

В частности, когда пользователь регистрирует U2F для веб-сайта, он вызывает веб-API браузера navigator.credentials.create, который, в свою очередь, связывается с аппаратным токеном и возвращает ответ. Я хочу изменить запрос и ответ от navigator.credentials.create API, вызываемого веб-страницей.


person tarun14110    schedule 05.02.2020    source источник
comment
Вы спрашиваете, возможно ли редактировать содержимое веб-запроса, отправленного пользователем (например, через веб-страницу)? Или, может быть, вы хотите изменить поведение какого-то веб-сайта? Вы должны добавить больше деталей к вопросу, это не так ясно.   -  person Marco Bonelli    schedule 10.02.2020
comment
@MarcoBonelli Мне очень жаль. Когда пользователь регистрирует U2F для веб-сайта, он вызывает веб-API браузера navigator.credentials.create, который, в свою очередь, связывается с аппаратным токеном и возвращает ответ. Я хочу изменить запрос и ответ от navigator.credentials.create API, вызываемого веб-страницей. Дайте мне знать, если это не имеет никакого смысла. Я добавлю больше деталей.   -  person tarun14110    schedule 11.02.2020
comment
Сомневаюсь, что вы получите осмысленный ответ на это. Весь смысл U2F/WebAuthN заключается в создании криптографически безопасной схемы запроса/ответа для строгой аутентификации в сети. Вставка прокси и изменение запроса и ответа нарушит этот криптографический запрос/ответ в любом контексте, где вы не являетесь MITM, оставив ваших пользователей в зависимости от вашего расширения для аутентификации. Это может помочь объяснить, что вы пытаетесь сделать с этими данными.   -  person gcochard    schedule 12.02.2020
comment
Что еще более важно, пожалуйста, покажите, что вы уже пробовали.   -  person gcochard    schedule 12.02.2020
comment
@ tarun14110 Я отредактировал ваш вопрос, добавив детали из вашего предыдущего комментария. Проверьте мой ответ.   -  person Marco Bonelli    schedule 12.02.2020
comment
@MarcoBonelli Я задал дополнительный вопрос по этому поводу. Не могли бы вы помочь мне с этим, когда у вас будет время? stackoverflow.com/questions/61948769/   -  person tarun14110    schedule 24.05.2020
comment
@ tarun14110 Я ответил на этот вопрос несколько месяцев назад. Я сейчас занят, извините.   -  person Marco Bonelli    schedule 24.05.2020


Ответы (1)


Невозможно достичь того, чего вы хотите, с помощью API Chrome. Chrome не предлагает никакого API для изменения запросов или других данных «на лету», как вам хотелось бы. Могу только предположить, что это, скорее всего, мера безопасности.

Однако, поскольку вы говорите, что хотите изменить данные, которые передаются и возвращаются navigaror.credentials.create() на каком-то конкретном веб-сайте, вы можете легко сделать это с помощью скрипта содержимого, который заменяет функцию настраиваемым обработчиком и действует как прокси, перехватывая все вызовы. и, возможно, изменение данных.

Имеет ли это какой-либо смысл или нет, зависит от того, что конкретно вы хотите делать при перехвате этих вызовов. Важно отметить, что, поскольку @gcochard обращает на себя внимание в комментарии:

Весь смысл U2F/WebAuthN заключается в создании криптографически безопасной схемы запроса/ответа для строгой аутентификации в сети. Вставка прокси и изменение запроса и ответа нарушит этот криптографический запрос/ответ в любом контексте, где вы не являетесь MITM, оставив ваших пользователей в зависимости от вашего расширения для аутентификации. Это может помочь объяснить, что вы пытаетесь сделать с этими данными.

В любом случае вы по-прежнему можете регистрировать данные и получать к ним доступ, так что может найти значимое применение этой стратегии.

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

Сценарий контента будет делать следующее:

  1. Создайте тег <script> внутри страницы, загрузив в него некоторый код, который будет:
  2. Сохраните create() метод navigator.credentials в другой переменной.
  3. Замените исходный метод 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
comment
Спасибо! это действительно полезно. Но я получаю ошибку Uncaught (in promise) NotSupportedError: Only exactly one of 'password', 'federated', and 'publicKey' credential types are currently supported. в строке real_create.apply(arguments);. Я еще не изменил аргументы. Просто пытаюсь заставить его работать. - person tarun14110; 12.02.2020
comment
@tarun14110 сначала найдите вызов, который работает с обычным navigator.credentials.create(), и только затем протестируйте оболочку. Если вы предоставляете недопустимые аргументы оболочке, это то же самое, что и предоставление недопустимых аргументов реальной функции. Прочтите документ: developer.mozilla.org/en-US/ документы/Web/API/CredentialsContainer/ - person Marco Bonelli; 12.02.2020
comment
Итак, navigator.credentials.create() отлично работает без этой оболочки. При использовании оболочки на Facebook.com я не меняю параметры запроса. Я просто передаю объект параметра как есть navigator.credentials.create(), как вы показали в своем ответе. Я все еще получаю ту же ошибку. Я что-то упускаю? - person tarun14110; 13.02.2020
comment
@ tarun14110 хм, сложно сказать, не глядя на код или некоторые console.log аргументов. Сделайте console.log для аргументов реального вызова до того, как это произойдет (используйте отладчик инструментов Chrome dev), а затем сделайте то же самое для вызова внутри вашей оболочки. Посмотрите, совпадают ли они (если это не работает в вашей оболочке, возможно, они не совпадают). - person Marco Bonelli; 13.02.2020