我有一个'升级'系统,用户确认代码并以声明的形式获得额外的权限。令牌更新后,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
})
}