首页 > 解决方案 > 让我的 Firebase 应用程序专门触发微服务

问题描述

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

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

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

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

标签: firebaseauthenticationjwtmicroservices

解决方案


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 中注册您的应用程序。请在此处查看我们的文档。]

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

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

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

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


推荐阅读