iframe 授权失败时露出 60000 JSON 的复盘

现象

外壳页面是 /bonder/external?iframeLink=/ddus/。内容区的 iframe 不直接打开被嵌系统,而是先打开同源授权地址:

/connector/common-admin-cloud/api/authority/admin/oauth2/v2/authorize?clientId=...&redirectUri=...&authorization=...

token 有效时,这个接口会把 iframe 转到 /ddus/,被嵌页面正常起来。token 无效时,接口返回 HTTP 200,响应体是一段 JSON:

json 复制代码
{"code":"60000","msg":"业务处理失败","subCode":"auth-check-error","subMsg":"登录已过期,请重新登录","success":false}

浏览器把这段 JSON 当成 iframe 里的文档画出来。被嵌系统的 HTML 和脚本都没有加载。

三层分别能不能处理

层级 结果
被嵌项目 /ddus 页面没有启动,里面原有的 60000 跳转不会执行
外壳 data-dock-web iframe 由外壳创建,授权接口又和外壳同源,外壳能读到这段 JSON
授权接口 浏览器打开时如果继续只返回 JSON,iframe 里就一定会先出现这段文本

这次改的是外壳。被嵌项目 platform-data-devops-ui 没有动。

复现

在开发者工具里改 iframe 的 src,把 authorization 末尾加上一个字符,回车。授权接口立即返回上面的 60000 JSON。

为什么会先闪出 JSON

iframe 此时已经按正常页面的尺寸显示。在开发者工具里改 src 是浏览器自己发起的导航,不会经过 Vue,外壳之前加上的「未确认前隐藏」也不会重新生效。

授权接口返回 JSON 后,浏览器收到响应就渲染。外壳只能在 iframe 的 load 里检查内容,而 load 发生在这一次渲染之后。所以错误 JSON 会先出现一帧。外壳无法在浏览器画出这份响应之前把它拦住。

为什么接着会空白再进登录

最初的处理是在 load 里直接改顶层 location,跳到 /bonder-login/。当前页先被卸掉,登录页还没回来,中间就是空白。

现在的行为

外壳在三个嵌入入口的 iframe @load 上做同一件事:

  1. about:blank 忽略。
  2. 读到 code 为 60000,或 subCode 为 auth-check-error、merchant-check-error 时,立刻把 iframe 收成不可见,弹出「登录已过期,请重新登录」。
  3. 点击「重新登录」后,清掉 token,顶层跳到 /bonder-login/,redirect_uri 使用当前外壳地址。
  4. 内容不是这段 JSON(包括最终跳到跨域业务页、外壳读不到文档)时,再把 iframe 显示出来。

由外壳自己更换 iframe 地址时,会先隐藏,确认内容安全后再显示,避免外壳导航过程中把错误 JSON 铺开。

边界

在开发者工具里直接改已经显示的 iframe src,浏览器仍可能先画出一帧 JSON,随后弹窗出现。点击「重新登录」之前不会离开当前页。

相关推荐
陈随易2 小时前
Postman 被曝自动往 Claude Code 和 Codex 装插件
前端·后端·程序员
Dream-Y.ocean4 小时前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
Csvn5 小时前
性能监控
前端
Highcharts.js5 小时前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
Csvn5 小时前
构建工具
前端
FRing036 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
kyriewen8 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
IT_陈寒8 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
工控丫丫9 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
jerrywus9 小时前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude