如何为ESP8266(MicroPython)的Firebase Realtime Database REST请求最简鉴权
最简方式实现ESP8266(MicroPython)访问Firebase Realtime Database的REST鉴权
针对你在ESP8266上用MicroPython访问Firebase Realtime Database的需求,最适合的方案是结合Web API Key使用匿名身份验证——既不需要完全关闭数据库安全,也不用复杂的OAuth2流程或定期生成Admin SDK密钥,完美适配资源有限的嵌入式设备。
核心思路
匿名身份验证是Firebase提供的轻量级鉴权方式:设备只需通过Web API Key向Firebase请求一个临时的用户ID Token,后续所有数据库REST请求携带这个Token即可。这种方式满足基础安全性(只有持有有效Token的请求才能访问数据库),同时实现成本极低。
具体实现步骤
1. 在Firebase控制台开启匿名身份验证
进入Firebase控制台 → 选择你的项目 → 左侧菜单Authentication → Sign-in method → 找到Anonymous选项 → 点击启用。
2. 配置数据库安全规则
保留基础安全,只允许已鉴权用户(包括匿名用户)访问数据库。在Firebase控制台 → Realtime Database → 规则中,替换为以下规则(可根据需求细化路径权限):
{ "rules": { ".read": "auth != null", // 仅允许已鉴权用户读取 ".write": "auth != null" // 仅允许已鉴权用户写入 } }
如果只想开放特定路径的权限,比如/sensor_data,可以修改为:
{ "rules": { "sensor_data": { ".read": "auth != null", ".write": "auth != null" }, // 其他路径默认拒绝访问 "$other": { ".read": false, ".write": false } } }
3. MicroPython代码实现
以下是完整的ESP8266代码示例,包含WiFi连接、匿名Token获取、数据库读写操作:
import urequests import json import network # 配置信息,请替换为你的实际内容 WIFI_SSID = "你的WiFi名称" WIFI_PWD = "你的WiFi密码" FIREBASE_WEB_API_KEY = "你的Firebase Web API Key" FIREBASE_DB_URL = "https://你的项目ID.firebaseio.com" # 连接WiFi def connect_wifi(): wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print(f"正在连接WiFi: {WIFI_SSID}") wlan.connect(WIFI_SSID, WIFI_PWD) while not wlan.isconnected(): pass print("WiFi连接成功,IP:", wlan.ifconfig()[0]) # 获取匿名身份Token(有效期默认1小时) def get_anonymous_token(): auth_url = f"https://identitytoolkit.googleapis.com/v1/accounts:signUp?key={FIREBASE_WEB_API_KEY}" try: response = urequests.post(auth_url, data=json.dumps({})) if response.status_code == 200: return response.json().get("idToken") else: print(f"获取Token失败: {response.text}") return None except Exception as e: print(f"请求异常: {str(e)}") return None # 读取数据库数据 def read_db(path): token = get_anonymous_token() if not token: return None request_url = f"{FIREBASE_DB_URL}/{path}.json?auth={token}" try: response = urequests.get(request_url) if response.status_code == 200: return response.json() else: print(f"读取数据失败: {response.text}") return None except Exception as e: print(f"请求异常: {str(e)}") return None # 写入数据库数据 def write_db(path, data): token = get_anonymous_token() if not token: return False request_url = f"{FIREBASE_DB_URL}/{path}.json?auth={token}" try: response = urequests.put(request_url, data=json.dumps(data)) if response.status_code == 200: print("数据写入成功") return True else: print(f"写入数据失败: {response.text}") return False except Exception as e: print(f"请求异常: {str(e)}") return False # 主程序 if __name__ == "__main__": connect_wifi() # 测试读取数据 sensor_data = read_db("sensor_data") if sensor_data: print("当前数据库数据:", sensor_data) # 测试写入数据 write_db("sensor_data", {"temperature": 25.6, "humidity": 62})
关键说明
- Token有效期:匿名Token默认有效期为1小时,如果设备需要长期运行,建议每50分钟重新获取一次Token,避免过期。
- Web API Key的作用:它仅用于请求匿名身份Token,不能直接作为数据库鉴权凭证——必须结合返回的
idToken才能访问数据库,这比直接暴露Admin SDK密钥安全得多。 - 安全性保障:即使Token泄露,攻击者也只能在1小时内访问数据库,且权限受规则限制;而Admin SDK密钥一旦泄露,攻击者可以完全控制你的数据库,绝对不能放在客户端设备中。
内容的提问来源于stack exchange,提问作者Alex Zaitsev
相关产品推荐
相关产品推荐

