1

我正在尝试将 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 的网络选项卡中得到上述结果,但我得到了奇怪/不一致的结果,响应我的 GoogleAuth.signIn 调用时发生了“popup_closed_by_user”和“popup_closed_by_browser”等响应。如果我从 NGINX 中删除标头,它会再次开始按预期运行。我不明白这是怎么回事。

4

0 回答 0