firebase - 让我的 Firebase 应用程序专门触发微服务
问题描述
我有一个运行我的 dockerized 应用程序的 Google VM,我也有我的 Firebase 前端应用程序。
我希望我的 Firebase 应用程序触发我的微服务。问题是,我希望有安全意识,我希望 Firebase 应用程序成为唯一可以触发微服务的参与者。
这种任务的最佳选择是什么?我发现的唯一东西是 json Web 令牌(jwts)。这足以胜任这份工作吗?有更好的吗?
如果 jwts 是需要的,那么代码应该具有的逻辑是什么?服务器是否应该创建一个密钥并将其发送到微服务,那么微服务应该对其进行解码,并且只有当它匹配一个值时它才应该继续工作?
解决方案
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_token
Apple 的客户端DeviceCheck API返回的值。这是 Base64 编码的Data
(Swift) 或NSData
(ObjC) 对象。
- 正文应该是一个带有单个字符串字段的 JSON 对象,
- 对于 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 令牌。
- 正文应该是一个带有单个字符串字段的 JSON 对象,
- 对于安全网,使用
https://firebaseappcheck.googleapis.com/v1beta/projects/<project_number>/apps/<app_id>:exchangeSafetyNetToken?key=<api_key>
- 正文应该是一个带有单个字符串字段的 JSON 对象,
safety_net_token
. 这是向您的应用发出的SafetyNet 证明响应。
- 正文应该是一个带有单个字符串字段的 JSON 对象,
- 对于自定义提供程序,请按照我们的公共文档中的说明进行操作。但是,您不会在您的应用程序中使用 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
- 这将返回RFC 7517 第 5 节指定的 JWK 集,其中包含可用于验证我们的 App Check 令牌的公钥。
同样,我们正在努力使您能够直接从 App Check SDK 检索 App Check 令牌,这样您就不必自己管理定期刷新或 POST 请求。请在下个月继续关注此功能。
推荐阅读
- java - 如何从命令行读取字符串而不接受整数作为参数
- angular - 使用套接字时,实时数据中的 amChart 中的“图表未处理”
- php - 在 Laravel 中创建备份 MySql 数据库的命令
- sql - 具有大表的 Postgresql 中的连接性能缓慢
- python - 选择列表中的特定统计信息
- ios - 将结构迁移到 Firebase 时“上传缺少所需的 dSYM”
- bash - 检索网页的特定部分
- ruby-on-rails - 如何挽救或防止 Rails 数据库连接异常并允许控制器操作继续
- php - 已安装 cURL,未定义函数 curl_init()
- amazon-web-services - 在 AWS ec2 中部署到 codedeploy 时出错