AppGameKit Studio调用Firebase实时数据库遇权限拒绝问题求助
问题解决:Firebase实时数据库权限拒绝与AppGameKit HTTP请求修正
核心问题分析
安全规则与请求路径不匹配
你的安全规则针对根节点下的$uid节点(即/{uid}/)设置读写权限,但请求路径是/data.json,规则未覆盖该路径,Firebase会默认拒绝所有未匹配规则的路径访问。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测试时需确保:
- 请求URL的
auth参数是有效的ID Token(可通过Firebase Auth登录接口获取) - 请求路径与安全规则匹配,例如
https://next-species-29059882-default-rtdb.firebaseio.com/users/s4hmxQDqFNbDPd13ioxaYzKJUbn1.json?auth=你的IDToken
内容的提问来源于stack exchange,提问作者David Wentworth
相关产品推荐
相关产品推荐

