使用自定义Auth Token调用Firebase实时数据库REST API返回未授权请求
问题排查与解决方案
核心问题:自定义Auth Token不能直接用于数据库请求
Admin SDK生成的自定义Auth Token并非实时数据库认可的有效访问凭证,它的作用是供客户端通过Firebase Auth的signInWithCustomToken接口交换为合法的ID Token。直接将自定义Token作为Bearer令牌发送,会因Token格式、受众不匹配导致验证失败,触发“未授权请求”。
具体排查与修复步骤
修正Token使用流程:
客户端必须先将自定义Token交换为ID Token,再用ID Token发起数据库请求:// Web客户端示例 firebase.auth().signInWithCustomToken(customTokenFromServer) .then(userCredential => userCredential.user.getIdToken()) .then(idToken => { fetch('https://<你的数据库ID>.firebaseio.com/actions.json', { headers: { 'Authorization': `Bearer ${idToken}` } }); });理解安全规则与Token验证的优先级:
即使安全规则设为.read: true,只要请求携带Authorization头,Firebase会优先验证Token有效性。若Token无效(比如直接使用自定义Token),会直接拒绝请求,不会触发公开访问规则。验证自定义Token的生成合法性:
用JWT解码工具检查Token内容,确保:aud字段为你的Firebase项目IDuid为合法非空值exp字段未过期
生成Token的代码需符合规范:
# Python Admin SDK示例 import firebase_admin from firebase_admin import auth cred = firebase_admin.credentials.Certificate('service-account-key.json') firebase_admin.initialize_app(cred) # 必须指定合法uid custom_token = auth.create_custom_token('valid-user-uid')明确IAM角色的作用范围:
Cloud Console中给服务账号配置的实时数据库管理员角色,仅适用于服务账号通过Admin SDK直接发起的服务器端操作,与客户端通过ID Token发起的请求无关。客户端请求的权限完全由Firebase安全规则控制。
内容的提问来源于stack exchange,提问作者Denno
相关产品推荐
相关产品推荐

