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
相关产品推荐
相关产品推荐

