没有办法通过 Chrome API 实现您想要的。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
变量是使用模板字符串文字创建的,由 characters 分隔`
,如果您不想使用模板文字,您可以使用字符串数组然后加入它。您还可以参考此答案,其中列出了将代码从内容脚本注入页面的其他方法。