用户身份验证后,由于安全规则,Firebase实时数据库查询失败,否则可以正常工作

时间:2018-07-18 22:12:57

标签: ios swift firebase firebase-realtime-database firebase-security-rules

用户登录后,我的应用程序从具有以下结构的数据库中加载数据:

  • 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中对用户进行身份验证,以便规则知道应该允许读取?我在这里做什么错了?

0 个答案:

没有答案