Firestore规则因令牌

时间:2018-03-22 16:26:34

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

我有一个'升级'系统,用户确认代码并以声明的形式获得额外的权限。令牌更新后,iOS客户端刷新令牌,我已确认声明现已存在。

但是,出于某种原因,以下规则经常(但并非总是)失败。特别是将值设置为

/databases/(default)/documents/users/z4enRpOt3TXwjUkyD7qsShXTRMF3/accounts/06f92564-56f0-4641-9aaa-97e6a5ce3044

..经常失败。

以下规则:

service cloud.firestore {
  match /databases/{database}/documents {

    function notAnonymous() {
      return request.auth.uid != null
    }

    function signedIn(uid) {
      return request.auth.uid != null && request.auth.uid == uid;
    }

    function deviceApproved(uid) {
      return signedIn(uid) && request.auth.token.deviceApproved == true;
    }

    function deviceOwner(uid) {
      return signedIn(uid) && deviceApproved(uid) && request.auth.token.ownershipApproved == true;
    }

    match /settings/public {
      allow read;
    }

    match /stocks/{stockId} {
      allow read: if notAnonymous();
    }

    match /bonds/{bondId} {
      allow read: if notAnonymous();
    }

    match /users/{uid} {
      allow read, write: if signedIn(uid);

      match /device/token {
        allow read, write: if signedIn(uid)
      }

      match /accounts/{accountId=**} {
        allow read: if deviceApproved(uid);
        allow write: if deviceOwner(uid);
      }
    }

  }
}

我尝试了许多不同的规则组合但没有成功。

不确定它是否有任何关系,但是在尝试写入之前,集合/ accounts /不存在。但是在我的理解中,规则应该允许创建文档。

用于设置值的代码如下。我正在使用RxSwift,但它只是包装标准集。

func savePending(account: Account) -> Observable<Account> {
    guard let userKey = account.userKey else { return Observable.error(AuthError.failedGettingUser) }
    let key = account.key ?? UUID().uuidString.lowercased()

    return Firestore.firestore()
        .collection("users").document(userKey)
        .collection("accounts").document(key)
        .rx.set(account.asDictionary())
        .debug()
        .flatMapLatest({ () -> Observable<Account> in
            return Observable.just(account)
        })
        .catchError({ (error) -> Observable<Account> in
            print(error)
            throw error
        })
}

0 个答案:

没有答案