用户登录后,我的应用程序从具有以下结构的数据库中加载数据:
archivedOrders
$orderId
ownedByUser
some other data
读取是由标准身份验证状态更改处理程序触发的:
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
if (user == nil) { //User signed out
AuthService.shared.signInAsAnonymous()
} else {
self.clearData()
archivedOrdersRef.removeAllObservers()
let archivedOrdersQuery = archivedOrdersRef.queryOrdered(byChild: "ownedByUser").queryEqual(toValue: user.uid).queryLimited(toLast: 25)
archivedOrdersQuery.observe(.childAdded, with: { (snapshot) -> Void in ...some code here...
})
此节点的规则如下:
"archivedOrders": {
".write": "auth != null",
".read": "(query.orderByChild == 'ownedByUser' && query.equalTo == auth.uid) ||
(query.orderByChild == 'restaurantId')",
当用户已经通过身份验证时,启动应用程序时一切正常。但是,如果用户在运行时登录,则没有任何数据,控制台将显示以下消息:
Listener at /archivedOrders failed: permission_denied
看起来数据库规则的auth几乎不知道该用户已使用新凭据进行了身份验证,并且应该能够查询该节点。
奇怪的是,如果我尝试刷新令牌并将订阅代码包装在其中
user!.getIDTokenForcingRefresh(true, completion: { (token, error) in
[subscription code]
})
我仍然在控制台中收到错误消息,但是数据到达了。
是否应该已经在stateDidChangeListener
中对用户进行身份验证,以便规则知道应该允许读取?我在这里做什么错了?