微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CORS / 跨域隔离 / Google API

如何解决CORS / 跨域隔离 / Google API

我正在尝试将 Zoom Web Video SDK 集成到现有的 Web 应用程序中,但出于性能原因,SharedArrayBuffer 已成为一项要求,为了启用它,站点必须实施跨源隔离。我已经继续向 Nginx 添加了必要的配置,即:

add_header 'Cross-Origin-Embedder-Policy' 'require-corp';
add_header 'Cross-Origin-Opener-Policy' 'same-origin';

...但当然这对之前存在和工作的站点的其余部分有连锁反应。 Google Api 似乎无法再成功加载。

我更改了我的 index.html 以将 crossorigin 属性添加Google Api 脚本标记中,如下所示:

<script src="https://apis.google.com/js/platform.js" async defer crossorigin></script>

...并且在我的 javascript 源代码我有(解释并降低复杂性以获得重点):

gapi.load('client:auth2',function() { 
  gapi.client
  .init({
     client_id: 'MY-CLIENT-ID',cookiepolicy: 'single_host_origin',discoveryDocs: ['https://classroom.googleapis.com/$discovery/rest?version=v1'],scope: 'profile email'
  })
  .then(() => console.log('init finished'))
  .catch(e) => console.error('init Failed',e));
});

在那段代码中,gapi 和 gapi.client 是明确定义的,但是 init 调用永远不会完成(没有来自 then 或 catch 的控制台日志)。查看 devtools 中的网络选项卡显示失败的 GET 请求:

https://content-classroom.googleapis.com/static/proxy.html?usegapi=1& ...以及其他一堆我不确定是否敏感的东西,所以我省略了

当您深入研究响应时,它会显示

要使用来自不同来源的此资源,服务器需要 在响应头中指定跨域资源策略:

  • Cross-Origin-Resource-Policy:same-site 如果资源和文档来自同一站点,请选择此选项。
  • Cross-Origin-Resource-Policy:cross-originonly 如果包含此资源的任意网站不强加 安全风险。

显然,我无法控制 Google 的服务器做什么,但谁能指导我如何使其正常工作。只有在本文开头我更改了 Nginx 配置时才会出错。

更新

我通过单独获取 API 的发现文档并将结果传递到 gapi.client.init 方法而不是 URL 来部分解决此问题。然而,虽然我不再在 devtools 的网络选项卡中得到上述结果,但我得到了奇怪/不一致的结果,如“popup_closed_by_user”和“popup_closed_by_browser”之类的响应发生在我的 GoogleAuth.signIn 调用中。如果我从 Nginx删除标头,它会再次开始按预期运行。我不明白这是怎么回事。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?