【问题标题】:Firestore - Managing User Sessions by revoking tokensFirestore - 通过撤销令牌管理用户会话
【发布时间】:2019-07-12 17:53:39
【问题描述】:

我正在研究能够管理用户会话 - 例如。撤销不良行为者的令牌,不要让他们立即访问数据(而不是在一小时/令牌生命周期后)。

在指南中提到能够与安全规则中存储的“撤销时间”进行比较。但它只提到了 Firebase 实时数据库。

https://firebase.google.com/docs/auth/admin/manage-sessions#detect_id_token_revocation_in_database_rules

保存刷新令牌撤销时间戳。这是通过 Firebase 规则跟踪 ID 令牌撤销所必需的。这允许在数据库中进行有效的检查。

{
  "rules": {
    "users": {
      "$user_id": {
        ".read": "$user_id === auth.uid && auth.token.auth_time > (root.child('metadata').child(auth.uid).child('revokeTime').val() || 0)",
        ".write": "$user_id === auth.uid && auth.token.auth_time > (root.child('metadata').child(auth.uid).child('revokeTime').val() || 0)"
      }
    }
  }
}

这里的关键是auth.token.auth_time

我尝试在 Firestore 安全规则中使用它,但它doesn't seem to be available

这在 Firestore 中是不可能的吗?

【问题讨论】:

    标签: google-cloud-firestore firebase-security


    【解决方案1】:

    也许这行得通,在 Firestore 中,您必须在集合或文档上设置这些规则。

    service cloud.firestore {
       match /databases/{database}/documents {
    
         match /collection/{documentId} {
            allow read, write: if request.auth.uid != null && request.auth.token.auth_time > (root.child('metadata').child(auth.uid).child('revokeTime').val() || 0);
         }
       }
     }
    

    如果我有时间我会自己尝试。

    【讨论】:

      【解决方案2】:

      Sebe 认为您需要将 request 放在 request.auth.token.auth_time 之前是正确的。

      即使它没有显示在文档中,但它似乎在那里。

      我必须在每个用户第一次注册时在AuthOnCreate 期间为他们创建自己的文档,以便有revoke_time 的字段(我制定的指定密钥,您可以选择自己的)。

      然后我将每个用户的这些存储在revoked_tokens 集合中,并可以在安全规则中进行比较。

      function notRevoked() {
            return request.auth.token.auth_time > get(/databases/$(db)/documents/revoked_tokens/$(currentUser().uid)).data.revoke_time;
      }
      

      Firestore 似乎与 RTDB 不同,因为您不能只使用默认值 || 0。您实际上需要在 Firestore 中有一个值来进行比较。我认为这是因为Firestore get() functions 返回null

      非空 rules.firestore.Resource 文档,或 null 如果它不存在。

      因此,如果该文档不存在并且您尝试深入了解get().data.someKey,它只会出错并破坏您的安全规则。这就像尝试做null.data.someKey

      【讨论】:

        猜你喜欢
        • 2015-12-08
        • 1970-01-01
        • 2018-09-21
        • 1970-01-01
        • 2019-04-12
        • 2021-06-26
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        相关资源
        最近更新 更多