Firestore-通过吊销令牌来管理用户会话

时间:2019-07-12 17:53:39

标签: google-cloud-firestore firebase-security-rules

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

在指南中提到了能够比较安全规则中存储的“撤销时间”。但是它只提到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中这不可能吗?

2 个答案:

答案 0 :(得分:1)

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

gcc something -Isomethingmore

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

答案 1 :(得分:0)

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