【问题标题】:How can I access Google Firestore from a Java client as a user (not admin)?如何以用户(而非管理员)身份从 Java 客户端访问 Google Firestore?
【发布时间】:2021-07-30 10:30:36
【问题描述】:

我想连接到 Firestore 并从 Java 客户端执行查询。客户端由 Firebase 应用程序的用户而不是管理员运行。我在字符串中有用户的 JWT。我不知道如何——以及使用哪些库——我可以 连接到 Firestore。

我尝试了什么:

  • 来自 Maven 的包:实施组:“com.google.cloud”,名称:“google-cloud-firestore”,版本:“2.6.1”
    • 此软件包似乎旨在用于具有管理员权限的安全服务器上,例如使用服务帐户。我找不到通过用户帐户使用它的方法。
  • 来自 Maven 的包:实施组:“com.google.firebase”,名称:“firebase-firestore”,版本:“23.0.3”
    • 此软件包适用于 Android,并引入了大量 Android 特定的依赖项。

为什么我认为这是可能的:

  • 在浏览器上运行的Javascript代码可以使用相应的Javascript库来做我想做的事(除了作为Java库),使用“firebase”NPM包
  • Android 特定的库被描述为我想要的(除了 android 部分)——虽然我不知道如何测试这个假设

我为什么要这样做:

  • 向用户授予管理员权限违反了最小权限原则
  • 在客户端应用程序和以管理员权限运行的 Firebase 之间设置服务器没有任何明显的目的;基于 Javascript 的客户端也不需要它,并且会引入一整层潜在的安全问题,因为该层中的任何错误都以管理员权限运行。

【问题讨论】:

    标签: java firebase security google-cloud-firestore admin


    【解决方案1】:

    Firebase/Firestore 没有客户端 Java SDK。 Firebase 为此类访问提供的唯一 SDK 是 Admin SDK,它(如您所说)提供特权管理访问。

    如果您想使用来自非 Android Java 代码的客户端凭据访问 Firestore,则必须 access Firestore through its REST API passing the user's ID token(而不是 OAuth2 令牌)以确保强制执行安全规则。

    【讨论】:

    • 感谢您提供的信息——很高兴知道有一个 REST API,并且对于其他读者:在该链接后面提到了一个 gRPC API,这可能也很有趣。 WRT 所需的凭据,Javascript Firebase 客户端使用哪种令牌?我问这个是因为该令牌在我的 Java 应用程序中使用。在外部,普通 Firebase 用户的令牌以及来自“gcloud auth print-identity-token”的身份令牌似乎都是 JWT,但我想这只是一种容器格式,可以是内部的任何东西。
    • 更新:我试图了解来自“gcloud auth print-identity-token”的令牌与 Firebase Web 客户端发送到 Firestore 的令牌之间的区别,但它们似乎都是 OpenID Connect JWT(具有与 OIDC 注册声明匹配的多个字段)。由于 OIDC 令牌是 OAuth2 令牌,因此 Javascript 客户端似乎 可以 使用 OAuth2 令牌访问 Firestore。 REST API 在这方面有什么不同吗?如果有,那里需要什么样的“用户 ID 令牌”?
    • REST API 可以确实使用 OAuth2 令牌,但这将授予您管理访问权限 - 这是您试图阻止的。要以普通用户身份访问,您应该使用他们的 ID 令牌,与 Firebase 身份验证客户端 SDK 一样。
    • 感谢您的澄清——我认为普通用户使用的 ID 令牌也是 OAuth2 令牌,因为它们是 JWT,其中包含的声明看起来像来自 OIDC 的众所周知的声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多