Firebase ID令牌太长,超过了标头的最大大小



我在一家公司工作,该公司在NodeJS的后端使用Firebase云功能,我们遇到了一个用户的特定问题:他的令牌超过7000个字符。

每次用户登录时,我们都会在前端获取他们的ID令牌,并在axios实例上为该令牌设置头属性,该axios实例指向我们的API,该API将使用该Firebase令牌对用户进行身份验证,如:


const setAPIHeader = (header, value) => {
    // axiosCustomApis: a list of Axios instances pointing to multiple APIs
    axiosCustomApis.map((api) => {
        api.defaults.headers.common[header] = value
    });
}
firebase.auth().onAuthStateChanged((user, error) => {
    if (!firebase.auth().currentUser) return;
    
    firebase
        .auth()
        .currentUser.getIdToken(true)
        .then((token) => {
            setAPIHeader("firebase-token", token)
        })
})

该用户能够正确登录,但是,每次他使用API提供的依赖于该令牌的服务时,他都会收到400的错误状态。

我们发现他的请求甚至没有到达后端,因此400没有被故意发送/由于内部API错误。

当我使用其他登录用户的令牌或不使用令牌进行测试时,我会得到预期的行为:用户被迫重新登录。

当我用小的假代币进行测试时,我也会得到预期的行为:被迫重新登录。

然而,如果我使用一个假的令牌进行测试,但使用与他的相同数量的字符,我会得到相同的问题结果:400

而且,我最终注意到他的代币总是大得离谱:通常我们的代币有3k个字符长,他的代币有7k个。

后端定义的最大标头大小为8192字节(节点版本:10.19.0(,因此这可能是问题所在。

我试图增加这个限制,为此,我放了以下代码来检查是否有任何变化:

const http = require("http");
...
console.log(`Max HTTP Header size is ${http.maxHeaderSize}`));

而且,我尝试过,在React应用程序中:

// package.json
"start": "set HTTPS=true && node scripts/start.js --max_old_space_size=16000" // from 8192 to 16000

在节点API中:

// package.json
"serve": "npm run watch & firebase serve --port 5000 --max-http-header-size=16000 --only functions",

这些都没有改变最大标头大小。

我想了解两种可能的解决方案:如何增加Firebase应用程序中的标头最大大小,以及是什么原因导致用户的令牌达到这种大小。

您使用的是node版本:10.19.0,小于14的node版本的最大标头大小为8kb。将您的节点版本更新为14或更高,您可以使用以下代码更新标头大小

 node --max-http-header-size=1600 server.js

或者,您也可以通过设置本github线程中提到的NODE_OPTIONS上的值来实现同样的目的

是什么原因导致用户的令牌大小如此之大。

Firebase ID令牌的长度取决于令牌中包含的确切信息,如用户名、uid、其他一些与配置文件和身份验证相关的信息以及其他自定义声明。

相关内容

  • 没有找到相关文章

最新更新