ESP32基于MicroPython带认证获取Firebase实时数据库数据问题
解决Firebase实时数据库权限拒绝问题
你当前的问题核心是:请求中auth参数传的是用户UID,但Firebase实时数据库要求的是用户登录后生成的ID令牌(ID Token),而非UID本身。以下是修正步骤:
1. 获取正确的ID令牌
使用micropython-firebase-auth库登录时,除了UID,还会返回idToken字段,这才是用于身份验证的凭证。示例代码如下:
from firebase_auth import FirebaseAuth auth = FirebaseAuth("<你的Firebase API_KEY>") # 邮箱密码登录获取用户凭证 user = auth.sign_in_with_email_and_password("<注册邮箱>", "<密码>") # 提取关键的ID令牌 id_token = user['idToken'] # 这个UID用于规则校验,但不是请求参数 uid = user['localId']
2. 用ID令牌发起合法请求
修改你的urequests请求,将auth参数替换为获取到的id_token:
import urequests def get_data(id_token): url = f"https://<DATABASE_NAME>.firebaseio.com/<NODE>.json?auth={id_token}" response = urequests.get(url) # 增加基础错误处理 if response.status_code == 200: return response.json() else: print(f"请求失败: {response.status_code}, {response.text}") return None # 调用时传入获取到的id_token data = get_data(id_token)
3. 额外校验点
- 确认数据库规则中的
<My uid>和登录用户的uid(即user['localId'])完全一致,注意字符大小写和完整性 - 检查请求的数据库节点路径是否正确,避免拼写错误
- ID令牌默认有效期为1小时,长期运行的设备需要调用
auth.refresh(user['refreshToken'])来刷新令牌,避免过期导致权限拒绝
内容的提问来源于stack exchange,提问作者Francisco Castorena S
相关产品推荐
相关产品推荐

