嵌入 iFrame 时 Google Apps 脚本不会加载

zlZ*_*mon 1 iframe web-applications same-origin-policy google-apps-script x-frame-options

我正在尝试将我的 Google Apps 脚本 Web 应用程序嵌入到另一个域上的 iFrame 中,但该 Web 应用程序未加载,我只看到白屏。webinspector 中也没有错误。

Web 应用程序的发布方式为:以我的身份执行,并且可以访问给定域内的任何人。

根据这个我实现了我的 doGet 方法,如下所示:

function doGet(e) {
 return HtmlService
 .createHtmlOutputFromFile('html/index')
 .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
Run Code Online (Sandbox Code Playgroud)

IFrame 看起来像这样:

<iframe src="https://script.google.com/a/my_domain/macros/s/ADjidojcojv/exec" title="test" width="558" height="300"></iframe>
Run Code Online (Sandbox Code Playgroud)

当用户登录 Google 时,将显示 web 应用程序。但是,当用户未登录灰色图像时account.google.com refused to connect

我认为原因是有一个重定向到谷歌登录不允许显示。此外,在这种情况下,还有另一个到 SAML SSO 应用程序的重定向。因此,当您正常登录 google 时,您将重定向到 SAML SSO 登录。

我在这里有什么选择?

[编辑]我发现有人有完全相同的问题和一个可能的解决方案。显然没有简单的方法可以做到这一点......

The*_*ter 5

当发布访问权限为“任何人”的网络应用程序时,最终用户需要登录。否则,用户将被重定向到 Google 登录页面。Google 的登录页面不允许使用 iframe。如果您已登录,网络应用程序不会重定向到 Google 的登录页面,并且不会出现此错误,否则会出现。

可能的解决方案:

  • 预先警告用户必须登录
  • 使用访问权限发布:“任何人,甚至匿名”
  • 如果这是不可能的,可以使用window.length(可跨源访问的少数属性之一)来检测 iframe 页面是否已加载窗口,如果页面拒绝连接,则该值将为 0,而在 web- 中该值将大于 0。应用程序,因为您的页面是 iframe 的。然后就可以将用户重定向到登录页面。
<!DOCTYPE html>
<html>
  <body>
    body
    <iframe
      src="https://script.google.com/macros/s/[SCRIPT_ID]/exec"
      >Loading
    </iframe>
    <script>
      (() => {
        console.log("loading page");
        const f = document.querySelector("iframe");
        f.onload = (e) => {
          console.log("iframe onload");
          const fw = f.contentWindow;
          if (fw.length > 0) console.info("logged in");
          else {
            alert("Please Login!");
            window.location = "https://accounts.google.com";
          }
        };
      })();
    </script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

参考: