我正在考虑能够管理用户会话-例如撤销不良行为者的令牌,而不是让他们立即访问数据(而不是在一个小时/令牌生命周期之后)。
在指南中提到了能够比较安全规则中存储的“撤销时间”。但是它只提到Firebase实时数据库。
保存刷新令牌吊销时间戳。这是通过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中这不可能吗?
答案 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