Node.js Jsonwebtoken验证导致NGINX超时
我正在处理的应用程序的通用技术堆栈是NodeJS后端、React前端和NGINX,用于反向代理来链接两者。所有集装箱均采用docker compose 我似乎遇到的问题是,当我尝试验证存储在仅HTTP cookie中、在API请求时传递到后端的JWT时,它在验证时被阻塞,导致超时。具体而言,此错误:Node.js Jsonwebtoken验证导致NGINX超时,node.js,reactjs,nginx,jwt,passport.js,Node.js,Reactjs,Nginx,Jwt,Passport.js,我正在处理的应用程序的通用技术堆栈是NodeJS后端、React前端和NGINX,用于反向代理来链接两者。所有集装箱均采用docker compose 我似乎遇到的问题是,当我尝试验证存储在仅HTTP cookie中、在API请求时传递到后端的JWT时,它在验证时被阻塞,导致超时。具体而言,此错误: 6#6:*4从上游读取响应头时,上游过早关闭连接,客户端:172.27.0.1,服务器:,请求:“POST/api/api/v1/getUserInfo HTTP/1.1”,上游:http://17
6#6:*4从上游读取响应头时,上游过早关闭连接,客户端:172.27.0.1,服务器:,请求:“POST/api/api/v1/getUserInfo HTTP/1.1”,上游:http://172.27.0.2:8080/api/v1/getUserInfo,主机:“本地主机”,推荐人:http://localhost/account“
我已经尝试在nginx中增加proxy\u read\u timeout/proxy\u send\u timeout,但似乎没有帮助
以下是我的JWT签名功能:
var privateKEY='testkey';
常量颁发者:字符串='test123';
const受众:字符串='test123';
module.exports={
符号:(有效载荷:任意)=>{
//令牌签名选项
var signOptions={
发行人:发行人,
观众:观众,,
expiresIn:“12h”//12小时有效期
};
返回jwt.sign(有效载荷、私钥、signOptions);
}
}
我如何调用该函数:
const-token=jwt.sign({
id:user.\u id,
firstName:user.firstName,
角色:user.role
});
我如何从cookie中获取令牌:
var cookieExtractor=函数(请求:请求){
var-token=null;
if(请求和请求cookie){
令牌=请求cookies[“令牌”];
}
返回令牌;
};
常量颁发者:string=“test123”;
常量受众:string=“test123”;
变量选项={
secretrokey:'testkey',
发行人:发行人,
观众:观众,,
jwtFromRequest:cookieExtractor
};
我的Passport JWT战略:
passport.use(
“jwt”,
新jwt策略(选项,(jwt_有效载荷,完成)=>{
findOne({{u id:jwt\u payload.id},(err,user)=>{
如果(错误){
返回完成(错误、错误);
}
如果(用户){
返回完成(空,用户);
}否则{
返回完成(null,false);
}
});
})
);
我如何调用身份验证:
app.post(`${versioning}/updateUserInfo`,(请求:请求,回复:响应)=>{
authenticate(“jwt”{session:false},(err,user,info)=>{
*在这里插入代码*
});
});
当我跟踪代码时,它似乎会在passport jwt库中的jwt.verify调用处暂停,然后再也无法通过该调用。我是JWT的新手,所以可能在这一过程中我做错了什么,我就是不明白为什么这一切突然停止了工作(这是一个次要项目,我上一次做它是在~1周前,这个问题从未发生过)
编辑
对于那些同样经历过这种情况的人,我从来没有找到一个明确的理由来解释原因。我更新了我的jsonwebtoken库,并停止使用Passport进行JWT验证,它开始为我工作。这是我现在使用的JWT验证方法,而不是Passport方法
verifyTokenOnly: (token: any, cb: any) => {
jwt.verify(
token,
publicUserKey,
{ audience: audience, algorithms: ["RS256"] },
(err: any, jwt_payload: any) => {
if (err || !jwt_payload) {
cb(err, null);
} else {
UserModel.findOne({ _id: jwt_payload.sub }, (err, user) => {
if (err) {
cb(err, null);
}
if (user) {
cb(null, user);
} else {
cb(null, false);
}
});
}
}
);
},
除此之外,我没有真正改变任何事情,它开始起作用,从那以后就再也没有发生过 你好。你有其他信息可以分享吗?也许直到现在你还发现了别的东西:-?我遇到了相同的问题,无法将其链接到任何particularity@AndreiTerecoasa不幸的是,我从来没能真正把它记下来。我用我修改过的内容编辑了我的原始帖子,但从那以后我再也没有遇到过任何问题。