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

Google OAuth令牌随机失效 刷新报unauthorized_client错误

根因分析

你遇到的unauthorized_client刷新令牌错误、凭证随机失效问题,核心是OAuth客户端类型选型错误+多客户端令牌逻辑不符合Google OAuth安全规则,具体原因如下:

  1. 客户端类型违规是触发随机吊销的核心原因
    Google对不同场景的OAuth客户端有严格的类型划分和使用校验:
    • iOS应用必须使用「iOS」类型OAuth客户端,绑定应用Bundle ID
    • Android应用必须使用「Android」类型OAuth客户端,绑定应用包名+签名SHA1
    • Electron这类桌面已安装应用必须使用「Desktop/Installed App」类型OAuth客户端
    • 只有纯Web网页场景才允许使用「Web」类型OAuth客户端,且重定向URI仅支持http/https协议
      你为三个非Web端全部创建Web类型客户端的实现本身违反Google OAuth使用规范,Google风控系统会周期性扫描授权请求的来源场景,一旦检测到Web客户端的授权流量来自移动端、桌面端等非Web场景,就会自动吊销该客户端下发的refresh_token,由于风控扫描是离线异步执行的,所以失效周期没有固定规律,短则数天长则数周。
  2. 跨客户端令牌混用直接触发unauthorized_client错误
    OAuth2协议中refresh_token是和签发它的client_id强绑定的,你为三个端创建独立客户端后,如果后端存储令牌时没有将refresh_token和对应client_id、client_secret绑定,出现用A客户端的凭证刷新B客户端签发的refresh_token的情况,会直接返回unauthorized_client错误。
    同时Google默认对同项目下请求相同scope的多个客户端有安全校验逻辑:当同一用户在同项目下的新客户端完成授权流程时,风控会自动判定其他客户端存储的同用户refresh_token存在泄露风险,批量触发吊销。
  3. 你提到的「单Web客户端配置多跳转URI存在异常」是配置方法错误导致的:Web客户端本身只需要配置Angular授权页的https地址作为唯一重定向URI,iOS/Android/Electron的回跳是Angular页拿到授权结果后做的二次跳转,不需要配置到Google OAuth的重定向列表里,你之前大概率把端的自定义scheme地址加到了Web客户端重定向规则里,才会触发配置报错。
修复方案

按以下步骤调整即可彻底解决问题:

  • 清理不合规客户端:删除之前为三端创建的三个Web类型OAuth客户端,按端类型新建合规客户端:
    • iOS端新建iOS类型客户端,填写应用正式Bundle ID即可,无需手动配置重定向URI,Google会自动适配对应Universal Link回跳
    • Android端新建Android类型客户端,填写应用包名、正式签名+调试签名的SHA1指纹即可,无需手动配置重定向URI
    • Electron端新建「已安装桌面应用」类型客户端,使用官方支持的本地环回地址作为回跳地址
    • 保留一个Web类型客户端,仅配置Angular授权页的https域名作为重定向URI,供Web端授权使用
  • 调整令牌存储逻辑:后端存储用户令牌时,必须将refresh_token、access_token和签发它的client_id、对应端标识做绑定,每个端的令牌独立存储,绝对不能跨客户端混用凭证刷新令牌。刷新access_token时,必须使用对应客户端的client_id和client_secret请求Google令牌端点。
  • (可选最简方案)如果不需要多端独立令牌,直接使用单个Web客户端即可实现全流程:三端唤起系统浏览器跳转到Angular页对应的授权URL时,在state参数里携带当前发起授权的端标识;Angular页拿到auth code发给后端完成令牌生成后,根据state里的端标识,通过Universal Link(iOS)、App Link(Android)、自定义协议(Electron)跳回对应端即可。该方案全程只有一个合规Web客户端,完全不会触发跨客户端风控吊销逻辑,也不需要为每个端单独创建OAuth客户端,维护成本最低。
  • 授权URL生成时必须固定携带access_type=offline参数,如果需要每次授权都拿到新的refresh_token,额外添加prompt=consent参数,避免Google返回空的refresh_token字段。

内容的提问来源于stack exchange,提问作者Zana Aziz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:31:10