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

AppGameKit Studio调用Firebase实时数据库遇权限拒绝问题求助

问题解决:Firebase实时数据库权限拒绝与AppGameKit HTTP请求修正

核心问题分析

  1. 安全规则与请求路径不匹配
    你的安全规则针对根节点下的$uid节点(即/{uid}/)设置读写权限,但请求路径是/data.json,规则未覆盖该路径,Firebase会默认拒绝所有未匹配规则的路径访问。

  2. Auth参数错误
    Firebase REST API的auth参数需要传入用户登录后获取的ID Token,而非用户UID。当前传入userdata.uid会导致身份验证失败,返回unauthorized request。


步骤1:修正安全规则

如果需求是让每个用户仅能读写自己的数据,建议将数据结构调整为/users/{uid}/,并对应修改规则:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    },
    // 若需保留/data节点,可根据需求添加规则,比如仅允许认证用户读写
    "data": {
      ".read": "auth !== null",
      ".write": "auth !== null"
    }
  }
}

若坚持使用现有/data路径且要按用户隔离,需调整规则逻辑匹配对应数据结构。


步骤2:修正AppGameKit HTTP请求代码

关键修正点:

  • 将auth参数替换为用户的ID Token
  • 调整请求路径以匹配安全规则
  • 修正ID Token的赋值逻辑

修正后的代码示例:

function senddatabase()
    local result$ as string
    local idToken$ as string
    IHTTP = CreateHTTPConnection()
    SetHTTPHost(IHTTP, "next-species-29059882-default-rtdb.firebaseio.com", 1)
    AddHTTPHeader( iHTTP, "Content-Type: application/json", "set" )
    
    // 正确获取用户登录后的ID Token(注释掉的那行才是正确的)
    idToken$ = userdata.idToken
    
    // 写入当前用户的users节点,路径对应规则中的$uid
    local requestPath$ = "/users/" + userdata.localid + ".json?auth=" + idToken$
    // 若写入data节点且规则允许认证用户访问,路径改为:"/data.json?auth=" + idToken$
    
    result$ = SendHTTPRequest(IHTTP, requestPath$, userdata.tojson())
    
    while GetHTTPResponseReady( iHTTP ) = 0
        print("connecting.....")
    endwhile
    
    response$ = GetHTTPResponse( iHTTP )
    statuscode = GetHTTPStatusCode( iHTTP )
    CloseHTTPConnection( iHTTP )
    rawdata = result$
endfunction result$

步骤3:邮件验证功能实现

邮件验证需调用Firebase Auth的REST API,而非数据库接口,示例请求逻辑:

function sendVerificationEmail()
    local IHTTP = CreateHTTPConnection()
    SetHTTPHost(IHTTP, "identitytoolkit.googleapis.com", 1)
    AddHTTPHeader( iHTTP, "Content-Type: application/json", "set" )
    
    // 构造请求体,传入ID Token
    local requestBody$ = '{"idToken":"' + userdata.idToken + '"}'
    local requestPath$ = "/v1/accounts:sendOobCode?key=你的Firebase项目API密钥"
    
    result$ = SendHTTPRequest(IHTTP, requestPath$, requestBody$)
    
    while GetHTTPResponseReady( iHTTP ) = 0
        print("sending verification email.....")
    endwhile
    
    response$ = GetHTTPResponse( iHTTP )
    statuscode = GetHTTPStatusCode( iHTTP )
    CloseHTTPConnection( iHTTP )
endfunction

注意替换你的Firebase项目API密钥为Firebase控制台中获取的Web API密钥。


测试验证

用Postman测试时需确保:

  1. 请求URL的auth参数是有效的ID Token(可通过Firebase Auth登录接口获取)
  2. 请求路径与安全规则匹配,例如https://next-species-29059882-default-rtdb.firebaseio.com/users/s4hmxQDqFNbDPd13ioxaYzKJUbn1.json?auth=你的IDToken

内容的提问来源于stack exchange,提问作者David Wentworth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:22:02