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

React Native Expo集成Clerk时出现base64字符串长度无效错误求助

解决React Native Expo中ClerkProvider的"Not a valid base64 encoded string length"错误

以下是针对你遇到的问题的具体修复步骤:

1. 检查Clerk密钥与环境变量

  • 确认EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY是从Clerk控制台复制的完整有效密钥,它本身是base64格式,长度必须符合规范,不能有截断或遗漏
  • 在_layout.js中添加日志,验证环境变量是否正确加载:
    console.log("Clerk密钥:", EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY);
    
  • 如果密钥为空,检查项目根目录的.env文件是否存在,变量名是否完全一致(必须带EXPO_PUBLIC_前缀,Expo才会将其暴露给客户端代码)

2. 升级Clerk Expo SDK版本

你当前使用的@clerk/clerk-expo@1.0.0版本较旧,和Expo 51存在兼容性问题:

  • 执行升级命令:
    npm install @clerk/clerk-expo@latest
    
  • 升级后清除Expo缓存,避免残留旧代码:
    npx expo start --clear
    

3. 清除SecureStore中的无效缓存

如果之前缓存了损坏的token,会导致Clerk解析时触发base64错误:

  • 在tokenCache.getToken方法中添加日志,查看返回的token是否异常:
    async getToken(key) {
      try {
        const token = await SecureStore.getItemAsync(key);
        console.log(`缓存的${key}令牌:`, token);
        return token;
      } catch (err) {
        console.error("获取令牌错误:", err);
        return null;
      }
    },
    
  • 如果发现无效令牌,直接卸载重装应用,或者临时添加代码清除缓存(执行一次后删除该代码):
    // 在RootLayout的useEffect中临时添加
    useEffect(() => {
      const clearInvalidCache = async () => {
        await SecureStore.deleteItemAsync("__clerk_token__");
        await SecureStore.deleteItemAsync("__clerk_refresh_token__");
      };
      clearInvalidCache();
    }, []);
    

4. 确保ClerkProvider初始化的合法性

在渲染ClerkProvider前,先检查密钥是否存在,避免传入undefined:

// 在RootLayout中添加检查
if (!EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY) {
  console.error("Clerk发布密钥缺失!");
  return null;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:54:55