iframe嵌入Google Apps Script Web应用报X-Frame-Options deny错误如何解决
报错根因
你配置的ALLOWALL规则仅作用于Google Apps Script(以下简称GAS)本身返回的业务页面,而用户未登录Google账号时,访问GAS Web应用会先自动跳转到Google官方登录页https://accounts.google.com/,该页面的X-Frame-Options响应头固定为deny,禁止所有第三方站点嵌入iframe,这才是报错的核心原因,和GAS本身的跨域配置无关。
可落地解决方案
方案1:调整GAS部署配置(操作最简单,无额外开发量)
如果你不需要获取访问用户的个人身份信息,直接修改GAS Web应用部署参数即可:
- 执行身份改为「以我(部署脚本的账号)的身份执行」
- 访问权限改为「所有人,甚至匿名用户」
该模式下用户访问GAS应用不会触发Google登录跳转,可直接嵌入iframe正常加载。
注意:该模式下代码中的Session.getUser().getEmail()会返回你部署账号的固定邮箱,无法拿到访问用户的个人邮箱。
方案2:改造前端交互逻辑(适配需要获取访问用户身份的场景)
既然Google登录页无法嵌入iframe,就把登录流程移出iframe完成:
- 第三方站点首次加载时不直接渲染GAS的iframe,先展示「登录Google账号使用应用」的按钮
- 用户点击按钮后,在新标签页或者当前页面直接跳转GAS Web应用地址,用户完成Google账号登录后,你可以在GAS端新增跳转逻辑,引导用户回到你的第三方站点
- 用户跳转回第三方站点后再渲染GAS的iframe,此时用户已经持有Google登录态,不会再触发登录页跳转,iframe可正常加载。
方案3:接入Google OAuth 2.0 前端授权(完全规避iframe限制)
如果你不想用iframe嵌入的方式,可以在你的第三方站点直接接入Google OAuth 2.0授权流程,用户在你的站点完成授权后,直接通过接口调用GAS的服务端能力,不需要嵌入iframe就能拿到用户的邮箱等信息,从根源上避免嵌入限制问题。
内容的提问来源于stack exchange,提问作者Parth
相关产品推荐
相关产品推荐

