应用检查对 Firebase 可调用函数的不必要强制执行

Posted

技术标签:

【中文标题】应用检查对 Firebase 可调用函数的不必要强制执行【英文标题】:App check unwanted enforcement on Firebase callable functions 【发布时间】:2021-09-23 21:52:01 【问题描述】:

没有更改我的 Firebase 可调用函数代码中的任何内容,而是重新部署了它们,现在他们突然开始拒绝来自我的应用程序的所有函数调用,并出现如下所示的错误。在我准备好进行所需的更改之前,我不想使用 App Check。如何阻止我的可调用 (https.onCall) Firebase 函数拒绝无效的应用检查,而只拒绝无效的身份验证?

Failed to validate AppCheck token. FirebaseAppCheckError: Decoding App Check token failed. Make sure you passed the entire string JWT which represents the Firebase App Check token.
    at FirebaseAppCheckError.FirebaseError [as constructor] (/workspace/node_modules/firebase-admin/lib/utils/error.js:44:28)
    at FirebaseAppCheckError.PrefixedFirebaseError [as constructor] (/workspace/node_modules/firebase-admin/lib/utils/error.js:90:28)
    at new FirebaseAppCheckError (/workspace/node_modules/firebase-admin/lib/app-check/app-check-api-client-internal.js:187:28)
    at /workspace/node_modules/firebase-admin/lib/app-check/token-verifier.js:82:19
    at processTicksAndRejections (internal/process/task_queues.js:97:5) 
  errorInfo: 
    code: 'app-check/invalid-argument',
    message: 'Decoding App Check token failed. Make sure you passed the entire string JWT which represents the Firebase App Check token.'
  ,
  codePrefix: 'app-check'
 

Callable request verification failed: AppCheck token was rejected. "verifications":"app":"INVALID","auth":"VALID"

由于无效的 App Check 拒绝所有请求的代码非常简单:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
exports.example = functions.https.onCall((data, context) => 
  return "test";

包.json:

"engines": 
    "node": "12"
,
"main": "index.js",
"dependencies": 
  "firebase-admin": "^9.10.0",
  "firebase-functions": "^3.14.1"
,

【问题讨论】:

这看起来像一个错误:github.com/firebase/firebase-functions/issues/967 【参考方案1】:

我也有同样的经历。文档说你应该像这样检查[1]:

  if (context.app == undefined) 
    throw new functions.https.HttpsError(
        'failed-precondition',
        'The function must be called from an App Check verified app.')
  

但是,根据我的经验,情况并非如此,当您将 App Check 添加到您的应用时,App Check 会立即开始执行。

编辑:

此外,即使没有对我的代码进行任何检查,每当我调用其中一个函数时,我都可以在日志中看到这一点:

Callable request verification passed "verifications":"auth":"VALID","app":"VALID"

所以看起来 App Check 是自动发生的,至少在 Callable Functions 中是这样。如果您想在您的某个函数中绕过 AppCheck,您可能想尝试使用 HTTP 函数(不可调用)。

[1] 来源https://firebase.google.com/docs/app-check/cloud-functions

【讨论】:

是的,这也是我注意到的,并认为我可以使用那个确切的功能。与文档相反,实际上所有检查似乎都是在云功能执行之前自动完成的 @thamey 查看我的编辑我通过检查函数日志发现了更多信息。【参考方案2】:

来自https.onCall 的协议规范:

可选 [Header]:X-Firebase-AppCheck:发出请求的客户端应用提供的 Firebase 应用检查令牌。后端自动验证此令牌并对其进行解码,将 appId 注入处理程序的上下文中。如果无法验证令牌,则拒绝请求。 (适用于 SDK >=3.14.0)

我的猜测是对您的可调用函数的调用包含无效的应用检查令牌。

如果您尚未在项目中配置 DeviceCheck 或/和 App Attest 证明提供程序,但已在客户端中包含 App Check 库,则在调用您的函数时,您的客户端代码可能包含一个虚拟 App Check 令牌(关于这个github issue)。

Firebase 团队正在努力进行更改,以减少体验混乱。请关注http://github.com/firebase/firebase-functions/issues/967 和https://github.com/FirebaseExtended/flutterfire/issues/6794 了解状态。

【讨论】:

以上是关于应用检查对 Firebase 可调用函数的不必要强制执行的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 可调用函数冷启动

使用可调用的 Firebase 云函数

如何使用 ReactJS 应用程序开发和测试 Firebase 可调用函数?

保护 Firebase 可调用函数免受中间人的影响

Firebase 可调用函数失败 CORS 重定向

Firebase 可调用函数 + CORS