Shopify 在秀 HTML-in-Canvas,开发者还在为丢掉的 token 写长帖
Tobi Lütke 让所有人去找 Expo Mode,演示基于 Google 新 HTML-in-Canvas API。回复区里,一位开发者贴出长帖:refresh token 有恢复机制,cycle token 丢了却只能等商家重新授权。
Tobi Lütke 在 X 上只发了一句话:去找 Expo Mode。他说这是用 Google 新出的 HTML-in-Canvas API 做的,Shopify 可能是最早用上的一批。原文在这里。
视频海报是蓝色主视觉。左侧竖排写着 Exponential,下面一行小字:Everything new for non-linear growth。右侧是一张节点网络,Agentic、Sidekick、Online 等标签被线连在一起。左下角写着 400M+ shoppers with Shop Pay accounts*,右下角写着 Shopify Payments prevents 12K+ high-risk payments each minute。
这条推文的信息量不大。它更像一个入口:Expo Mode 是什么、怎么进、具体能做什么,Tobi 没展开。回复区有人直接问,按哪个按钮才能进 Expo Mode。Kurt Elster 留了一句:bug report,Konami code 在这个页面没反应。
真正有信息量的是另一条回复。Jon Purvis 贴了一个 Shopify 开发者社区的长帖,标题是 Please add recovery parity with refresh tokens。帖子聊的是 offline access token 的迁移故障,和 Expo Mode 无关。帖子在这里。
背景并不复杂。Shopify 正在把不设过期时间的 offline access token 迁到会过期的 token 加 refresh token。对后台应用来说,这把 token 是访问店铺的钥匙。Shopify 最近给 refresh token 加了更稳的恢复机制:刷新成功但应用没存下新 token,旧 refresh token 还能再用一次。问题出在 cycle,也就是把旧的长期 token 换成新的过期 token 对。
Jon Purvis 描述的失败链路是:应用拿旧的 shpat_ 作为 subject token 发起 cycle,Shopify 接受了交换,在同一笔事务里销毁旧 token,并发回新的 access token 和 refresh token。如果应用这时丢了 HTTP 响应,或者 worker 崩了,或者数据库写入失败,新 token 没存下来,旧 token 又已经没了。再重试,返回 invalid_subject_token。店铺成了孤儿,只能等商家重新打开应用授权。
Shopify 文档已经写明 cycling 不可逆,也不适合重放。文档甚至承认,应用丢掉响应后,店铺没有可用 token,商家必须重新授权。Jon Purvis 的诉求是:refresh 有恢复路径,cycle 也该有。要么给一个有边界的重试窗口,要么让同一个 subject token 的第二次调用幂等返回同一对 token,要么给 Partner 侧一个不需要商家浏览器的恢复 API。
这组对照比演示本身更有意思。前台在展示 HTML-in-Canvas 能把界面带到哪里,后台在讨论一次丢响应会不会把安装实例变成死店。Agentic、Sidekick、webhook、定时同步,这些词都指向同一类应用:商家不在 admin 里,后台任务也得跑。恰恰是这类应用,最怕 cycle 丢响应后只能等商家回来点授权。
Expo Mode 值得看。看的时候也翻一下回复区。Konami code 没反应是玩笑。token 重试没反应是工单。
发布时间: 2026-10-29 05:32