iOS Firebase / Firestore权限被拒绝

时间:2018-09-20 09:39:48

标签: ios swift firebase google-cloud-firestore firebase-security

我知道这个问题经常被问到,但是提出的解决方案并不能解决我的问题。

我试图建立一个基本的iOS Firestore应用程序,该应用程序在集合中写入一些文档。 我遵循标准过程,将GoogleService-Info.plist添加到我的项目中,并在启动时调用FirebaseApp.configure()。

我的Firestore规则如下:

@WebService(targetNamespace = "http://tempuri.org/", name = "MyService")

@EndpointProperties(value = {
        @EndpointProperty(key = "webservice.security.authMethod", value = "WS-SECURITY")
        @EndpointProperty(key = "ws-security.callback-handler", value = "org.tempuri.ServerPasswordCallback")
    }
)


public interface MyService {
...
}

现在,一旦我尝试将某些内容保存在集合中,Firebase就会向我返回“权限被拒绝”错误。

但是,如果我的规则如下:

@EndpointProperty(key = "webservice.security.authMethod", value = "WS-SECURITY")

接受写入。显然,该请求似乎不包含任何身份验证信息,但是我找不到与此有关的任何其他文档。我错过了什么?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我的猜测是,由于您不使用Firebase身份验证服务进行身份验证,因此该请求缺少身份验证信息。

摘自Firebase文档:

  

身份验证   最常见的安全规则模式之一是根据用户的身份验证状态控制访问。例如,您的应用可能希望仅允许登录用户写入数据

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow the user to access documents in the "cities" collection
    // only if they are authenticated.
    match /cities/{city} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

https://firebase.google.com/docs/firestore/security/rules-conditions

您可以在通过Firebase身份验证服务进行身份验证后尝试该规则,并检查该规则是否通过。

答案 1 :(得分:2)

如果您在应用中使用身份验证,则应使用

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

仅当您在应用中添加了Firebase身份验证时,此方法才有效,但如果未添加,则它将返回 PermissionDenied

您也可以使用此方法

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

但是这种方法并不安全,任何人都可以一次更改整个数据库,而且Firebase不建议您使用此方法。

如果您处于开发模式,请使用它并创建数据库,但是如果要投入生产,则只需将其更改为任一模式即可。

allow read, write: if request.auth.uid != null;

或者如果您的应用程序中没有身份验证。

allow read, write: if false;

希望这可以帮助您更好地理解。