标签: firebase-security-rules

使用Firebase进行秘密URL身份验证

我有一个使用Firestore和Cloud Functions的客户端Web应用程序.

我想设置规则,使得如果用户具有用户能够写入的文档的秘密URL,则无需任何其他类型的登录或身份验证.像(伪代码,我刚刚编写request.params.secret_token):

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      allow read, write: if resource.data.secret_token == request.params.secret_token;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我对各种可用的身份验证选项感到困惑,并且无法通过最好的方式推理.

感觉接近的潜在选择:

  • 可能需要匿名身份验证,这可能会让我获得身份验证令牌.据我所知,如果没有这些,我就无法走得很远.
  • 使用自定义声明,但它表示您只能在服务器端安全地设置它们.
  • 使用自定义令牌,但是当我有一个预先存在的登录服务器组件时,这似乎更适用.

firebase google-cloud-firestore firebase-security-rules

7
推荐指数
1
解决办法
395
查看次数

允许在firestore中对单个字段进行更新

我想让用户有权更新文档.但仅限用户更新此文档的一个特定字段.此用户不应更改所有其他字段.

这可能在火店吗?

我试过这样的事情:

function isUpdateToOpenField(attr) {
    return attr == get(/databases/$(database)/documents/stores/$(store)).data.open;
}

allow update: if isUpdateToOpenField(request.resource.data);
Run Code Online (Sandbox Code Playgroud)

但我不知道如何比较更新是否对应于正确的字段.

firebase-security google-cloud-firestore firebase-security-rules

7
推荐指数
4
解决办法
2118
查看次数

Firestore规则验证时间戳

我想通过客户端发送Firestore文档的创建时间,并使用Firestore规则验证时间,以避免云函数调用(定价).

脚本

我正在测试客户端对Firestore规则的请求,如下所示:

allow create: if request.resource.data.TIMEFIELD == request.time;
Run Code Online (Sandbox Code Playgroud)

该请求包含一个TIMEFIELD具有时间戳的请求,就像request.time.

问题

显然,请求时间和我在发送请求之前设置为字段的时间不相等,这使得这种比较变得不可能.

以下是request.time文档中的定义.

当服务收到请求时.

我想知道是否有办法在文档中设置一个等于的字段request.time.

由于Flutter存在问题,我无法使用服务器端时间戳.
因此,我需要知道如何验证客户端时间戳,例如time.nowFirestore规则.

firebase google-cloud-firestore firebase-security-rules

7
推荐指数
1
解决办法
946
查看次数

为什么在我测试更新或创建Firebase模拟器时会抛出无效的参数错误?

这是我的错误: 运行模拟错误—错误:Simulator.rules第[10]行,第[13]列。找不到函数错误:名称:[get]。错误:提供了无效的参数来调用。函数:[get],参数:[“ || invalid_argument ||”]

当我运行此程序时,我已经用尽了我在网络上可以找到的所有资源,却找不到任何可以使用的资源(当我只使用isSignedIn()时,允许读取的工作和创建的工作)...一点帮助。

service cloud.firestore {
	match /databases/{database}/documents{
    match /users/{documents} {     
	 function isSignedIn() {
         return request.auth != null;
    }
	 function getRole(admin){
   		return get(/databases/$(database)/documents/users.[request.auth.uid]).data.admin;   		
   }        
     allow read: if true; 
     allow write: if getRole(admin) == true;    
    }
  }  
}
Run Code Online (Sandbox Code Playgroud)

这是我的数据库

firebase google-cloud-firestore firebase-security-rules

7
推荐指数
1
解决办法
573
查看次数

Firebase托管的身份验证

我在Firebase托管上托管了一个静态应用,其后端也在Firebase上(使用firebase JS api进行通信)。我想向该网站的所有页面添加一个简单的身份验证页面,以便只有我想要的用户才能访问该网站。这可能吗?

查看了文档,但没有找到任何可以帮助我的方面。

firebase firebase-hosting firebase-authentication firebase-realtime-database firebase-security-rules

6
推荐指数
2
解决办法
4581
查看次数

使用auth.uid的基于查询的规则不起作用

我有以下结构:

events
-LEe7X118dkcH2JhJRe
    description: "Testdescr"
    eventTasks
    participants
        0zlwpSlCazNGjOyMi95h8awshrG2
            lastLogin: 1528641494535
            userKey: "0zlwpSlCazNGjOyMi95h8awshrG2"
            username: "User1"
        6LnYKxRu2SWUrxwIzId8dDpOrl02
            lastLogin: 152856590172
            userKey: "6LnYKxRu2SWUrxwIzId8dDpOrl02"
            username: "User2"
Run Code Online (Sandbox Code Playgroud)

我想查询用户参与者(如过滤器)的所有事件.我的Java代码是:

mDatabaseReference = FirebaseDatabase.getInstance().getReference("event");
mDatabaseReference.orderByChild("participants/"+userId+"/userKey").equalTo(userId).addChildEventListener [...]
Run Code Online (Sandbox Code Playgroud)

这就像一个魅力 - 我只收到正确的事件.

现在,我想在服务器端创建基于查询的规则(https://firebase.google.com/docs/database/security/securing-data).所以我创建了一个读取规则,如:

".read": "query.orderByChild == 'participants/'+auth.uid+'/userKey' && query.equalTo == auth.uid"
Run Code Online (Sandbox Code Playgroud)

问题:我无法保存该规则.Firebase给出了错误:"无效==表达式:与排序进行比较时,右操作数必须是排序或字符串文字." 为什么不能将"query.orderByChild"与auth.uid结合使用?

我究竟做错了什么?

编辑:这是我的完整规则:

{
  "rules": {         
    ".write": true,
     "event":{
       ".read": "query.orderByChild == 'participants/'+auth.uid+'/userKey' && query.equalTo == auth.uid"      
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

database-design firebase firebase-realtime-database firebase-security-rules

6
推荐指数
0
解决办法
203
查看次数

允许在Firestore中更新特定的嵌套值

我需要让匿名用户能够更新嵌套体系结构中的特定值,而无需对文档的其余部分授予权限.

events 是一个顶级集合,我更新我的文档是这样的

update(`events/${event.id}`, {
  [`boardgames.${boardgameId}.votes.${uid}`]: true,
})
Run Code Online (Sandbox Code Playgroud)

我试过这个解决方案

allow update: if ((request.writeFields.size() == 1) && ('boardgames' in request.writeFields));
Run Code Online (Sandbox Code Playgroud)

这里提到但它失败了(两个半部也独立失败).

我错过了什么?当'进入'嵌套对象时,我不会只更新一个字段吗?

能够console.log request和它是非常有帮助的request.writeFields.

注意,理想情况下我只想允许修改最深的属性,当前用户的uid内部votes.

javascript firebase-security google-cloud-firestore firebase-security-rules

6
推荐指数
1
解决办法
90
查看次数

找不到函数错误:名称:[get]。在Firestore安全规则模拟中

match /UserProfile {
    match /{uId}{
    allow get: if isUserLoggedIn() && !isUserBlocked(uId);
  }
Run Code Online (Sandbox Code Playgroud)

当我尝试使用上述安全规则从UserProfile / {uId}获取数据时,在Firestore和代码中抛出以下错误,提示权限不足:

Error running simulation — Error: simulator.rules line [199], column [28]. Function not found error: Name: [get].
Run Code Online (Sandbox Code Playgroud)

现在上面两个函数的定义在这里

function isUserLoggedIn(){
    return request.auth != null;
}

function isUserBlocked(uId){
    return (('blocked' in get(/databases/$(database)/documents/UserSettings/$(uId)).data) && (request.auth.uid in get(/databases/$(database)/documents/UserSettings/$(uId)).data.blocked));
}
Run Code Online (Sandbox Code Playgroud)

第一个功能运行得很好,但是第二个功能却不能

它抛出该错误

据我所知,功能还不错

请帮助我在这个问题上浪费了很多时间

我尝试过的

  1. 我在其中一个线程中读到这是一个暂时性问题,但事实并非如此。现在已经超过48小时
  2. 在某处还提到这仅是模拟器中的错误,但是代码可以平稳运行,即使不是这种情况。在代码中,错误是我所期望的权限不足
  3. 我已经正确阅读了文档,所以我的代码可以在其他规则中测试get方法,并且可以正常工作

多数民众赞成在请帮助

firebase google-cloud-firestore firebase-security-rules

6
推荐指数
1
解决办法
716
查看次数

类型的firestore数据库验证

任何人都知道如何验证基础instanceof

这似乎是一个没有脑子的检查,但我在文档中找不到这种类型的验证的参考,我的尝试是不正确的.

如果值不是a,我想失败Date.它可能是Timestamp当前版本的firestore中的一个.

尝试失败

allow write: if request.resource.data.date instanceof Date;
allow write: if request.resource.data.date instanceof Timestamp;
allow write: if !!Timestamp(request.resource.data.date);
allow write: if !!rules.Timestamp(request.resource.data.date);
allow write: if !!rules.Timestamp.date(request.data.date);
allow write: if !!Timestamp.date(request.data.date);
allow write: if !!Timestamp(request.data.date);
Run Code Online (Sandbox Code Playgroud)

firebase google-cloud-firestore firebase-security-rules

5
推荐指数
1
解决办法
1139
查看次数

您如何调试Firestore安全规则?

我在哭自己要睡这个。

getAfter返回的对象只有一个字段,因为其他所有字段类型都不正确。我不知道如何在没有任何调试工具的情况下进行检查(我看不到数据,因此只能进行猜测和检查)。

这是我的规则的精简版本users

match /users/{userId} {
  function isValidUser(user) {
    return user.id is string &&
       (user.address is string || user.address == null) &&
       (user.dateOfBirth is number || user.dateOfBirth == null) &&
       user.email is string &&
       user.name is string &&
       (user.phoneNumber is string || user.phoneNumber == null);
  }

  function isValidWrite(userId, user) {
    return signedIn() && 
        writeHasMatchingId(userId, user) &&
        isValidUser(user);
  }

  allow read: if signedIn();
  allow create: if signedInAndWriteHasMatchingId(userId) &&
    userHasId(userId) &&
    isValidUser(request.resource.data); // Tested
  allow update: if isValidWrite( …
Run Code Online (Sandbox Code Playgroud)

firebase google-cloud-firestore firebase-security-rules

5
推荐指数
1
解决办法
847
查看次数