You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:09:24