Chrome扩展程序 - 在使用manifest v3的背景脚本中尝试使用fetch()时遇到CORS错误

7

当我尝试从我的Chrome扩展程序的后台脚本进行请求时,出现了CORS错误。该后台脚本与webpack捆绑在一起。

注意:如果我将manifest.json转换为版本2,则一切正常。但是使用v3会出现以下错误:

由于CORS策略,已阻止从源'chrome-extension://exampleid'访问'https://example.com/api/user/login'。所请求的资源上没有'Access-Control-Allow-Origin'标头。如果不需要访问响应正文,请将请求的模式设置为'no-cors'以禁用CORS获取资源。

manifest.json

{
  "name": "__CE_APP_NAME__",
  "version": "__CE_APP_VERSION__",
  "manifest_version": 3,
  "background": {
    "service_worker": "background.bundle.js",
    "type": "module"
  },
  "content_scripts": [
    {
      "matches": [
        "https://example.com/*"
      ],
      "js": ["content.bundle.js"]
    }
  ],
  "web_accessible_resources": [
    {
      "resources": [ "images/*", "*.css" ],
      "matches": [
        "https://example.com/*"
      ]
    }
  ],
  "permissions": [
    "storage",
    "unlimitedStorage",
    "cookies",
    "identity"
  ],
  "host_permissions": [
    "<all_urls>"
  ]
}

background.js

chrome.runtime.onMessage.addListener((req) => {
  if (req.type === 'auth/login') {
    login(req.payload);
  }

  return true;
});

interface LoginCredentials {
  email: string;
  password: string;
}

const login = (data: LoginCredentials) => {
  fetch(`${API_BASE_URL}/user/login`, {
    method: 'POST',
    body: new URLSearchParams({
      email: data.email,
      password: data.password
    })
  })
    .then((response) => console.log(response))
    .catch((error) => console.log(error));
};

有人修好了吗?我也遇到了同样的问题。 - Pietro Nadalini
你是否正确地刷新了你的扩展? - Hristo Enev
问题在于,如果我关闭扩展并重新打开它,而不手动刷新,它会给我CORS错误,我正在尝试找到一种不需要手动刷新的解决方案。 - Pietro Nadalini
如果你做了,请告诉我。我每次都在手动刷新。它需要刷新服务工作者。 - Hristo Enev
4个回答

2
这是Chrome的一个错误,当重新启用扩展时,它没有应用正确的策略主机设置。如果您使用的版本低于“94.0.4606.54(官方版本)”,则必须在重新启用扩展后进行手动刷新(点击刷新按钮)。
在报告错误此处之后,我被告知该错误已经通过此次提交修复,并将成为Chrome 94的一部分。
如果您现在下载Beta版本,您将会注意到该错误已经得到了修复,并且它将在2021年9月21日正式发布(即本回答的明天)。您可以在这里查看时间表。

0

这可能是你问题的答案 manifest.json

"permissions": [
"*://*.google.com/*",
],
"host_permissions": ["https://*/"]

1
欢迎来到Stackoverflow。这个问题已经被提出超过1年了,并且已经有一个被接受的答案。请添加一些关于你添加新答案的原因的细节。 - MD Zand

0

这是我解决这个问题的方法(将其附加到清单):

"content_security_policy": {
  "extension_pages": "default-src 'self'; connect-src https://* data: blob: filesystem:;"
}
  • default-src 'self' 是默认设置,而 Chrome Web Store 无论如何都会要求它。如果未设置,将出现以下错误:
    CSP directive 'script-src' must be specified (either explicitly, or implicitly via 'default-src') and must whitelist only secure resources.

  • connect-src https://* data: blob: filesystem:; 需要通过 CORS。

适用于 XMLHttpRequest(AJAX)、WebSocket、fetch() 或 EventSource。如果不允许,则浏览器会模拟 HTTP 400 状态码。

我在这里找到了信息 here


-1

这是我的解决方案:

我认为之前没有生效,是因为我只是使用了“加载未打包的扩展程序”的操作,希望它会刷新扩展程序。不过看来刷新并没有完全完成,需要进行额外的一步操作。在扩展程序页面右下角点击“刷新”按钮。

希望不久能够出现更好的自动化方式,实现某种热重载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接