使用 auth.uid 限制对 Firebase-Database 的访问不起作用

Posted

技术标签:

【中文标题】使用 auth.uid 限制对 Firebase-Database 的访问不起作用【英文标题】:Restrict access to Firebase-Database with auth.uid not working 【发布时间】:2019-02-26 15:32:24 【问题描述】:

我想限制对我的 Firebase 数据库的访问,以便只有我授权的用户才能对其进行写入。 但是几乎所有地方提出的解决方案似乎都对我不起作用。

我的控制台中总是出现 401(未经授权)错误。

我尝试了两种方法来检查正确的用户是否登录,但它们都不适合我。:

1. uid 硬编码在规则中:


"rules": 
  ".read": true,
  ".write": "auth.uid === 'UID'")",
    

2。数据库中的uid


"rules": 
  ".read": true,
  ".write": "root.child('users').hasChild(auth.uid)",
    

在这两种方式中,我都使用了 Firebase-Authentication 概述中提供的 uid。 我使用 Google 作为登录提供商。

【问题讨论】:

【参考方案1】:

来自the documentation:

下面是一个规则示例,该规则授予已验证的写入权限 users 到/users/<uid>/,其中<uid> 是获取到的用户ID 通过 Firebase 身份验证。


编辑:

对于通过 Firebase 身份验证的特定路径和当前获得的用户,这应该会有所帮助:


  "rules": 
    "YourSpecificPath": 

     "$uid":  // where <uid> is the ID of the user obtained through Firebase Authentication
        ".write": "$uid === auth.uid"    
        ".read": true,

      
    
  

或者,直接给uid


  "rules": 
    ".read": true,
    ".write": "auth.uid === 'dJrGShfgfd2'"
  

【讨论】:

感谢您的回答。我不想授予一个用户访问特定路径的权限。我想实现一个用户可以写入所有数据。而其他人都做不到。这可能吗? 那我必须把我的整个数据库包装到uid中吗?用户应该有类似管理员功能的东西 在这种情况下,您也可以直接(以管理员身份)提供uid。检查弗兰克的答案:***.com/a/41775839/4409113 更新了答案。 好吧,我现在感觉真的很愚蠢...我切换到 axios 并忘记在我的补丁请求中发送 idToken...哦,奇怪:它是未经授权的...无论如何谢谢你 :) 【参考方案2】:

所有代码示例均正确

所有代码片段,在 Mohsen 的问题和答案中 工作。 我只是忘记在我的补丁请求中发送 idToken。

获取idToken的代码:

firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) 
  // Send token to your backend via HTTPS
  // ...
).catch(function(error) 
  // Handle error
);

来自:https://firebase.google.com/docs/auth/admin/verify-id-tokens#retrieve_id_tokens_on_clients

使用 idToken 进行身份验证:

https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json?auth=<ID_TOKEN>

来自:https://firebase.google.com/docs/database/rest/auth

【讨论】:

那我相信你应该接受我的回答,因为它是正确的。但是,你得到了我的解释。这将有助于未来的搜索:) 快乐编码。

以上是关于使用 auth.uid 限制对 Firebase-Database 的访问不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用auth.uid变量在firebase上设置indexOn规则?

Firebase 规则如何获取“request.auth.uid”字段?

关于在Firebase auth Uid下检索嵌套数据并使用android studio推送uid

Firebase - auth.uid 是共享机密吗?

Firebase Firestore 安全规则 |如果字段值与 auth uid 相同,则允许读取

IdToken()和Uid()在firebase中有什么区别