【问题标题】:Let my Firebase application trigger microservice exclusively让我的 Firebase 应用程序专门触发微服务
【发布时间】:2021-08-25 13:52:58
【问题描述】:

我有一个运行我的 dockerized 应用程序的 Google VM,我也有我的 Firebase 前端应用程序。

我希望我的 Firebase 应用程序触发我的微服务。问题是,我希望有安全意识,我希望 Firebase 应用程序成为唯一可以触发微服务的参与者。

此类任务的最佳选择是什么? 我发现的唯一东西是 json Web 令牌(jwts)。这足以胜任这份工作吗?有更好的吗?

如果需要jwts,那么代码应该具备的逻辑是什么? 服务器是否应该创建一个密钥并将其发送给微服务,那么微服务应该对其进行解码,并且只有当它与一个值匹配时才应该继续工作?

【问题讨论】:

  • 新的Firebase App Check 功能是为这类事情而设计的,但我认为它的服务器端 API 还没有准备好。
  • @FrankvanPuffelen 谢谢!但是,当您指的是服务器端时,您指的是微服务端(而不是 firebase 端)。我理解正确吗?
  • 正确。 App Check 当前允许特定 Firebase 服务仅允许来自在项目中注册的应用的流量,您正在寻找另一面:仅允许来自这些应用的流量到您的服务。 考虑应用检查的东西,只是还没有。另见groups.google.com/g/firebase-talk/c/rU0fEozdMyc/m/AYUa6PpLCAAJ

标签: firebase authentication jwt microservices


【解决方案1】:

Firebaser 在这里。

我实际上并不完全确定您的架构,但如果您希望减少对自己的服务器的滥用,该服务器在 Android、iOS 或 Web 上为您的 Firebase 应用提供服务,那么是的,我们正在努力支持此用例在App Check

但是,App Check 不是用于保护服务器到服务器的通信(两台服务器都在您的控制之下)。在 Google Cloud 上,这通常使用服务帐号和 IAM 控件来完成。

除此之外,假设您想要第一件事而不是第二件事,并且假设您不想等待官方支持准备好,那么实际上您有一种方法可以做到这一点现在,但你必须自己做很多工作。此外,由于 App Check 目前处于 Beta 阶段,因此它可以以向后不兼容的方式进行更改,并且不受任何 SLA 或弃用政策的约束。

为了获取 App Check 令牌,您可以对这些端点进行 POST。这些实际上是 SDK 在后台使用的相同端点,因此您可以研究它们的源代码以查看如何进行这些调用的示例。您还应该按照他们的示例,根据返回的 App Check 令牌的到期时间定期重新证明应用程序并重新获取 App Check 令牌。

[编辑:确保首先在 App Check 中注册您的应用。请在此处查看我们的documentation。]

  • 对于 DeviceCheck,使用 https://firebaseappcheck.googleapis.com/v1beta/projects/<project_number>/apps/<app_id>:exchangeDeviceCheckToken?key=<api_key>
    • 正文应该是一个带有单个字符串字段device_token 的JSON 对象。这是 Apple 客户端 DeviceCheck API 返回的 device_token。这是 Base64 编码的 Data (Swift) 或 NSData (ObjC) 对象。
  • 对于 reCAPTCHA v3,使用 https://firebaseappcheck.googleapis.com/v1beta/projects/<project_number>/apps/<app_id>:exchangeRecaptchaToken?key=<api_key>
    • 正文应该是一个带有单个字符串字段recaptcha_token 的JSON 对象。这是reCAPTCHA v3 JavaScript API 返回的 reCAPTCHA 令牌。
  • 对于 SafetyNet,请使用 https://firebaseappcheck.googleapis.com/v1beta/projects/<project_number>/apps/<app_id>:exchangeSafetyNetToken?key=<api_key>
  • 对于自定义提供程序,请按照我们的public documentation 中的说明进行操作。但是,您不会在您的应用程序中使用 App Check SDK。相反,您需要直接编写代码来联系您的令牌服务器。

如果相应的令牌无效,这些端点将拒绝带有403 Forbidden 的请求。您的客户只应在此类失败时重试少量有限次,因为情况可能不会改变,如果您重试,您还应该使用相应的证明提供者重新运行整个证明流程。

一旦您的应用通过上述方式收到 App Check 令牌,您应该将其附加到对您想要保护的 API(在您的服务器上)发出的每个请求中。例如,您可以通过标头发送 App Check 令牌。一旦您的服务器收到此类请求,请使用 Admin SDK Verify Token API 验证此令牌。例如,

const admin = require("firebase-admin");

admin.initializeApp();

async function verifyToken(token) {
  admin.appCheck().verifyToken(token)
    .then((token) => {
      console.log(token.token)
    })
    .catch((e) => console.log(e))
}

这个验证令牌 API 实际上是我们的 Callable Functions SDK 在后台使用的。如果令牌无效,您的服务器应拒绝该请求。

请注意,此验证令牌 API 可以向我们的公钥端点发出 GET 调用(但随后会缓存一段时间),因此请记住,如果您的带宽有限、CPU 周期有限或没有在令牌验证时缓存:

  • https://firebaseappcheck.googleapis.com/v1beta/jwks
    • 这会返回一个由 Section 5 of RFC 7517 指定的 JWK 集,其中包含可用于验证我们的 App Check 令牌的公钥。

同样,我们正在努力让您能够直接从 App Check SDK 检索 App Check 令牌,这样您就不必自己管理定期刷新或 POST 请求。请在下个月继续关注此功能。

【讨论】:

  • 感谢您的帖子!这是一个很好的参考。我本质上想要的是我的烧瓶服务器在 Google VM 中的 docker 容器上运行,只接受来自我的 Firebase 应用程序的调用,并排除来自其他方的所有其他请求。
  • 经过更多研究,我发现了这个主题:cloud.google.com/functions/docs/networking/connecting-vpc。是否可以选择对 Firebase 服务器的微服务进行访问控制?
【解决方案2】:

firebaser 在这里

新的Firebase App Check 功能是为这类事情而设计的,但如何从您自己的服务器端代码访问此类应用令牌尚未确定。

因此,App Check 当前允许特定 Firebase 服务仅允许来自在项目中注册的应用的流量。您正在寻找另一面:仅允许来自这些应用的流量流向您的服务,目前尚不支持。

另见https://groups.google.com/g/firebase-talk/c/rU0fEozdMyc/m/AYUa6PpLCAAJ

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-08-14
  • 2021-12-05
  • 2019-09-20
  • 2015-08-07
  • 2022-12-07
  • 2019-04-13
  • 2018-06-09
  • 1970-01-01
相关资源
最近更新 更多