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

React Native生产构建环境下Refresh Token失效问题求助

React Native生产环境Token刷新机制失效排查方案

核心问题

开发环境下Token刷新逻辑正常,生产构建后上传应用商店,触发401时刷新Token的API未被调用,Charles监控无刷新请求记录。

排查方向与解决方案

1. 检查HTTP状态码常量拼写错误

代码中response.statusCode === HttpStatusCode.unathorized存在明显拼写错误:unauthorized少写了字母z。

  • 开发环境可能因类型未严格校验或常量值巧合匹配,逻辑正常触发;
  • 生产环境编译后,错误的常量名可能对应无效状态码(比如undefined),无法匹配真实的401状态码,直接跳过刷新逻辑。
  • 修复:将HttpStatusCode.unathorized改为HttpStatusCode.unauthorized,同步校验HttpStatusCode枚举的定义。

2. 排查AsyncStorage存取与解析异常

生产环境中AsyncStorage的行为可能与开发环境存在差异:

  • 空值或解析错误:refreshTokenValue可能为null,执行JSON.parse(refreshTokenValue)时抛出错误,进入catch分支后直接抛出异常,未执行刷新API调用。
    • 修复:在解析前增加空值校验:
      if (!refreshTokenValue) {
        throw new Error('Refresh token not found');
      }
      const refreshResponse = await this.refreshToken.updateToken({
        refresh_token: JSON.parse(refreshTokenValue),
      });
      
  • 存储格式不一致:确认AsyncStorage中存储的accessToken和refreshToken是否为JSON字符串,若实际存储的是原始字符串,JSON.parse会抛出错误,导致请求头未携带Token,触发401但后续刷新逻辑因异常中断。

3. 生产环境错误类名称被混淆压缩

代码中依赖e.constructor.name匹配错误处理器:

const errorHandler = this.errorHandlers[e.constructor.name];
  • 生产构建时,JS压缩工具(如Terser)会混淆类名,自定义错误RevokedRefreshToken、PaymentRequired的名称可能被改为a、b等短名,导致无法匹配errorHandlers中的键,直接抛出异常中断刷新流程。
  • 修复:
    • 给自定义错误添加唯一标识属性:
      class RevokedRefreshToken extends Error {
        errorType = 'RevokedRefreshToken';
        // ...
      }
      
    • 改为通过标识属性匹配处理器:
      const errorHandler = this.errorHandlers[(e as any).errorType];
      

4. 验证生产环境HttpClient的响应处理

确认生产环境中HttpClient的实现是否正确返回statusCode:

  • 部分HTTP库或自定义拦截器在生产环境可能将401错误包装为异常抛出,而非返回包含statusCode: 401的HttpResponse对象,导致代码无法进入刷新分支。
  • 排查:通过远程日志工具打印response完整结构,确认statusCode是否正确传递。

5. 补充生产环境异常日志

生产环境默认屏蔽控制台日志,导致刷新逻辑中的异常无法被发现:

  • 集成远程日志工具(如Sentry),捕获catch分支中的异常信息,确认是否有解析错误、网络错误等导致流程中断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 18:40:31