Chrome 扩展 20 小时后没有“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】Chrome 扩展 20 小时后没有“Access-Control-Allow-Origin”标头【英文标题】:Chrome extension No 'Access-Control-Allow-Origin' header after 20 hours 【发布时间】:2016-11-02 22:25:36 【问题描述】:

我使用chrome.identity.getAuthToken 与一些内部API 对话。 前 20 小时一切都很完美,我可以调用 API 并得到我需要的东西。

大约 20 小时后,我的扩展程序停止工作,我得到:

请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'https://MY_API' 因此不允许访问。

我知道chrome.identity.getAuthToken 将更新过期的令牌,我可以看到在chrome://identity-internals/,我的代码获得了一个新的访问令牌,但无法发送请求。

如果我再次卸载/安装扩展程序,它就会再次工作。

清单包含:

"permissions": [ "tabs", "activeTab", "cookies", "identity", "<all_urls>" ]

当我重新安装使错误消失的扩展程序时会发生什么?

background.js:

    chrome.identity.getAuthToken(interactive: true, function(token) 

        gapi.auth.setToken('access_token': token);

        // Load the storage API.
        gapi.client.load(API_ROOT + DISCOVERY_PATH,
            VERSION, function() 
          // Initialize GAPI's OAuth.
          gapi.auth.init(function() 
            var request = "It's request to my API";

            // Not working after 20 hours
            request.execute(function(response) 
             // do something
            );

          );
        );
      )

还尝试调用“chrome.identity.removeCachedAuthToken”,但扩展在 20 小时后停止工作。

【问题讨论】:

这需要更重要的澄清。你在哪里看到这个错误?它在内容脚本中吗?因为很奇怪你的 API URL 是 origin。请包含触发此错误的代码(屏蔽 URL)。 我更新了我的第一个帖子 为什么.. 你为什么要使用所有事物的 GAPI 来访问你的 API? 这是此 API 使用的示例。抱歉,我对此很陌生,这是我第一次使用 auth 2 / gapi / chrome 扩展。我是否需要使用另一种方式来访问我的 API(我有 gapi load 的示例)' 【参考方案1】:

在服务器“https://MY_API”上设置此设置:

Header always append X-Frame-Options SAMEORIGIN
Header add Access-Control-Allow-Origin "*"

在 .htaccess 或 httpd.conf 中(如果服务器是 httpd/apache)

【讨论】:

这是一个(大)假设,即 API 由扩展开发人员控制。这种情况很少见。 我无法进行此类更改。我不控制那个。谢谢!【参考方案2】:

当您卸载/重新安装扩展程序时,其内部状态将被完全擦除;这会使您的代码获得一个全新的令牌,而不是刷新以前获得的令牌。

至于 Access-Control-Allow-Origin 标头 - 这是一个 服务器端 响应标头,我们只能猜测为什么某些随机的 3rd-party API(您甚至没有命名)会发生这种变化.一个合理的猜测是您达到了某些速率限制或配额,尽管为此使用 CORS 很奇怪。

requesting cross-origin permissions 可以永久忽略此特定错误,这会使 Chrome 忽略来自扩展程序(包括内容脚本)的请求的 CORS。但是,您应该仔细检查 API 的使用条款(如果有)。

【讨论】:

谢谢。我无法与您共享此 API 名称。这是我们公司拥有的东西。我有以下权限:“权限”:[“选项卡”、“活动标签”、“cookies”、“身份”、“”],如何在不重新安装的情况下获得全新的令牌?有什么办法吗? 如果是你自己的 API,你应该认为这是一个错误并进行调查。 好的,这非常有趣。如果您拥有"&lt;all_urls&gt;" 的权限,则您的扩展程序的任何请求都不会触发此操作。所以这意味着chrome.identity API 本身不受跨域权限的约束。那很奇怪。可能是 Chrome 中的一个错误。 如何在没有实际重新安装的情况下在代码中模拟重新安装?我尝试从现金中删除令牌,但遇到了同样的问题。 你可以试试chrome.identity.removeCachedAuthToken。如果您已经尝试过,您可以将其添加到问题中吗?我已经用你的清单更新了它。

以上是关于Chrome 扩展 20 小时后没有“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

移动 Chrome 上的 CORS Allow-Access-Control-Origin

chrome 扩展上的 Access-Control-Allow-Origin

chrome 扩展中的 Access-Control-Allow-Origin 错误

跨域 Chrome 扩展

chrome 87:请求的资源上不存在“Access-Control-Allow-Origin”标头

推荐一个可以把网页背景色调成护眼色的Chrome扩展应用