基于Expo的React Native应用使用Firebase JS SDK集成App Check后的认证问题咨询
问题2:启用App Check强制校验后Storage报“用户未认证”
这个问题的核心是:启用App Check强制校验后,Storage要求请求同时满足用户认证和App Check令牌验证,缺一不可。你需要检查这几个关键点:
确保客户端同时传递Auth和App Check令牌
首先要确认你在Expo里正确初始化了App Check,并且用AppAttest完成了激活。注意Expo环境下不能直接用Firebase JS SDK的原生AppAttestProvider,需要借助expo-app-check包来获取令牌,再传给Firebase App Check:import { initializeApp } from "firebase/app"; import { getAppCheck } from "firebase/app-check"; import * as AppCheck from 'expo-app-check'; // 初始化Firebase App const firebaseConfig = { /* 你的Firebase配置 */ }; const app = initializeApp(firebaseConfig); // 初始化Expo App Check(AppAttest) await AppCheck.initializeAppCheck({ apple: { provider: AppCheck.AppleProvider.APP_ATTEST, appAttestPublicKeyIdentifier: '你的App Attest公钥ID' // 从Apple Developer后台获取 }, // 安卓的配置如果需要的话也加上 }); // 把Expo的App Check令牌传给Firebase const appCheck = getAppCheck(app); appCheck.activate( new CustomProvider({ getToken: async () => { const tokenResult = await AppCheck.getAppCheckTokenAsync(); return { token: tokenResult.token, expireTimeMillis: tokenResult.expireTime }; } }) );确保你用Firebase SDK的方法操作Storage(比如
getDownloadURL),SDK会自动给请求加上X-Firebase-AppCheck头和Auth信息。检查Storage的安全规则
启用App Check强制后,你的Storage规则必须同时验证request.auth和request.appCheck,否则即使有令牌也会被拒绝。比如:rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null && request.appCheck != null; } } }排查开发环境的App Check问题
在Expo开发模式下,AppAttest可能无法正常工作(因为需要正式签名和Bundle ID),你可以暂时用调试令牌测试:- 去Firebase控制台的App Check页面,为你的应用生成调试令牌
- 客户端初始化时改用调试模式:
await AppCheck.initializeAppCheck({ apple: { provider: AppCheck.AppleProvider.APP_ATTEST_DEBUG, debugToken: '你的调试令牌' } });
验证App Check令牌的有效性
可以在客户端打印App Check令牌,然后去Firebase控制台的App Check页面验证令牌是否有效,同时确认你的应用已经在Firebase App Check里完成了配置(比如正确的Bundle ID、App Attest公钥)。
内容的提问来源于stack exchange,提问作者Umair A.
相关产品推荐
相关产品推荐

