我正在替换navigator.credentials.create()
和navigator.credentials.get()
使用 chrome 扩展。navigator.credentials.create()
用于为第二因素身份验证注册“安全密钥”。我的替换脚本适用于 Facebook 和 GitHub 等网站,但不适用于 Gmail、Twitter、亚马逊 AWS 等网站。可能是什么问题?为什么这里有不一致的地方?
content_script.ts
const webauthnInject = document.createElement('script');
webauthnInject.type = 'text/javascript';
webauthnInject.src = 'chrome-extension://' + chrome.runtime.id + '/js/inject_webauthn.js';
document.documentElement.appendChild(webauthnInject);
inject_webauthn.ts
(() => {
cKeyCredentials.create = async (options: CredentialCreationOptions): Promise<Credential | null> => {//code}
cKeyCredentials.get = async (options: CredentialRequestOptions): Promise<Credential | null | any> => {//code}
Object.assign(navigator.credentials, cKeyCredentials);
})();
清单.json
"content_scripts": [
{
"all_frames": true,
"matches": [
"https://*/*",
"http://*/*"
],
"exclude_matches": [
"https://*/*.xml"
],
"run_at": "document_start",
"js": [
"js/content_script.js"
]
}
],
"permissions": [
"tabs",
"storage"
],
"web_accessible_resources": [
"js/inject_webauthn.js",
"img/*"
],
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
更新
正如 wOxxOm 和 kaiido 所指出的,这个问题很可能是因为新的动态 iframe。所以,我正在尝试使用 mutationObserver
var observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
[].filter.call(mutation.addedNodes, function (node) {
return node.nodeName == 'IFRAME';
}).forEach(function (node) {
node.addEventListener('load', function (e) {
console.log('loaded', node.src);
});
});
});
});
observer.observe(document.documentElement, { childList: true, subtree: true });
我在 content_script.js 中添加了上述观察者。它仍然没有检测到相关的新 IFRAME。
当我启动 2FA 时,会加载调用 credentials.create APi 的脚本。有没有办法找到为什么我注入的代码函数没有在这里调用?