You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Banno插件Android端从操作按钮返回后OAuth认证报InternalServerError

Banno Android端OAuth授权码复用问题修复方案

额外检测维度

除URL参数外,可新增以下4类判断条件,组合判定是否需要走认证流程:

  • 本地有效token校验:检测sessionStorage/localStorage中是否存在未过期的identity token,只要有有效凭证直接跳过授权码处理逻辑
  • 授权码使用标记校验:每次成功用code兑换token后,在sessionStorage中存储该code的哈希值作为已使用标记,拿到URL中的code后先比对已使用列表,命中则直接判定为无效
  • 会话一致性校验:初始化OAuth流程时生成的state参数需要和code verifier绑定存储在本地会话中,拿到URL携带的state后先校验是否和当前会话未完成流程的state匹配,不匹配则不发起token兑换请求
  • 页面加载来源校验:通过performance.navigation.type判断页面加载类型,值为2时属于后退/缓存恢复场景,直接忽略URL携带的auth code参数

具体落地方案

以下方案可完全避免该场景下复用失效授权码的问题:

  • 兑换成功后立刻清理URL参数:token兑换成功后调用history.replaceState移除URL中的code、state参数,替换为不带敏感参数的插件根路径,从源头避免重载后读取到已使用的授权码

参考实现代码:

if (window.history.replaceState) {
  const cleanUrl = window.location.origin + window.location.pathname;
  window.history.replaceState({}, document.title, cleanUrl);
}
  • 服务端增加授权码有效性校验:存储code verifier时同步设置10分钟有效期,并且标记授权码的使用状态,只要code被调用过一次就立刻标记为失效,前端收到服务端返回的code失效状态码时,直接静默触发重新认证流程即可,不需要抛出未捕获错误
  • 外部跳转逻辑优化:主操作按钮的外部跳转优先调用Banno插件原生的外部链接打开API,而非默认window.open,避免Android端WebView的页面状态缓存问题,跳转前提前持久化当前会话的有效token,返回后直接读取本地状态即可,无需重载页面重新走认证流程

内容的提问来源于stack exchange,提问作者Elijah Chisholm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:45:07