python - (如何)您可以将用户从 Firebase 中注销吗?
问题描述
我们使用 Firebase 进行用户身份验证。
我可以在客户端登录用户,然后从 python 应用程序运行以下命令:
import firebase_admin
import firebase_admin.auth
from firebase_admin import credentials
from datetime import datetime
cred = credentials.Certificate('my_creds.json')
app = firebase_admin.initialize_app(cred)
firebase_admin.auth.revoke_refresh_tokens('some-user-id', app=app)
u = firebase_admin.auth.get_user('some-user-id')
print(datetime.fromtimestamp(u.tokens_valid_after_timestamp / 1000))
它显示当前时间戳,至少据我了解管理用户会话文档,它应该撤销令牌。我认为应该这样做,以便我在客户端执行的任何进一步操作都会失败。
然而,事实并非如此。我可以弹出'some-user-id'
已登录的控制台并运行:
firebase.database().ref('some/key').once('value').then(function(snap){ console.log(snap.val()); });
片刻之后,我会观察它的值some/key
就好了。
这不好。
当我运行时firebase.auth().currentUser.reload()
,它实际上会断开我的会话,我将无法再获得该值。但是我想在服务器端做一些事情来做到这一点,这样来自客户端的每个后续请求都会因身份验证问题而失败。
这可能吗?如果是这样,我该怎么做?
解决方案
revoke_refresh_token()
使“刷新令牌”无效。它不会使已登录的用户会话无效。事实上,当前会话中的任何“ID 令牌”都可以在一个小时内保持有效(之后用户将被迫登录)。如果您想了解更多关于这两种令牌之间的区别,请查看这篇文章。
要防止使用旧的(撤销前)ID 令牌访问数据库,您应该使用 Firebase 安全规则。您可以将其写入tokens_valid_after_timestamp
数据库:
auth.revoke_refresh_tokens(uid)
user = auth.get_user(uid)
revocation_second = user.tokens_valid_after_timestamp / 1000
# Write the revoke time to database as part of the
# server-side revoke operaition
metadata_ref = firebase_admin.db.reference("metadata/" + uid)
metadata_ref.set({'revokeTime': revocation_second})
然后实施一个规则来检查 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)"
}
}
}
}
此配置可防止用户使用在users/{uid}
撤销之前获得的 ID 令牌访问节点。
该解决方案在文档中进行了概述。
推荐阅读
- c++ - 如何修复 C++ 中结构的分段错误?
- javascript - JavaScript 比较两个具有相同 ID 的元素,如果它们的内容不同,则为它们设置样式
- sql - 如何修复 sql 中的“ORA-02270:此列列表没有匹配的唯一键或主键”错误
- python - 子类实例的类型提示
- c - 分段故障恢复 HashTable 值
- javascript - 在 React Native 中授予权限
- xpath - 使用 importxml 在 Google 表格中提取当前价格、交易量和平均交易量的 XPath 查询
- symfony - 从单个对象下载多个文件
- java - 捕获异常后方法可以再次调用自己吗?
- python - Elasticsearch 7.0:过滤 must_not 查询错误