我在一家公司工作,该公司在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、其他一些与配置文件和身份验证相关的信息以及其他自定义声明。