Общий технический стек для приложения, над которым я работаю, - NodeJS backend, React frontend, NGINX для обратного прокси-сервера, связывающего эти два. Все контейнеры с использованием docker compose.
Проблема, с которой я, похоже, сталкиваюсь, заключается в том, что, когда я пытаюсь и проверяю JWT, которые хранятся в только для HTTP готовке ie, переданной бэкэнду по запросам API, это задерживается на проверке, вызывающей тайм-аут. В частности, эта ошибка:
6#6: *4 upstream prematurely closed connection while reading response header from upstream, client: 172.27.0.1, server: , request: "POST /api/api/v1/getUserInfo HTTP/1.1", upstream: "http://172.27.0.2:8080/api/v1/getUserInfo", host: "localhost", referrer: "http://localhost/account"
Я попытался увеличить proxy_read_timeout / proxy_send_timeout в nginx, но это, похоже, не помогло.
Вот мой Функция подписи JWT:
var privateKEY = 'testkey';
const issuer: String = 'test123';
const audience: String = 'test123';
module.exports = {
sign: (payload: any) => {
// Token signing options
var signOptions = {
issuer: issuer,
audience: audience,
expiresIn: "12h", // 12 hour validity
};
return jwt.sign(payload, privateKEY, signOptions);
}
}
Как я вызываю эту функцию:
const token = jwt.sign({
id: user._id,
firstName: user.firstName,
role: user.role
});
Как я получаю токен от повара ie:
var cookieExtractor = function(req: Request) {
var token = null;
if (req && req.cookies) {
token = req.cookies["token"];
}
return token;
};
const issuer: string = "test123";
const audience: string = "test123";
var opts = {
secretOrKey: 'testkey',
issuer: issuer,
audience: audience,
jwtFromRequest: cookieExtractor
};
Моя стратегия Passport-JWT:
passport.use(
"jwt",
new JWTStrategy(opts, (jwt_payload, done) => {
UserModel.findOne({ _id: jwt_payload.id }, (err, user) => {
if (err) {
return done(err, false);
}
if (user) {
return done(null, user);
} else {
return done(null, false);
}
});
})
);
Как я вызываю аутентификацию:
app.post(`${versioning}/updateUserInfo`, (req: Request, res: Response) => {
passport.authenticate("jwt", { session: false }, (err, user, info) => {
*insert code here*
});
});
Когда я прослеживаю код, кажется, что он останавливается на Вызов jwt.verify в библиотеке passport-jwt и затем никогда не проходит мимо этого. Я новичок в JWT и все такое, так что, может быть, я делаю что-то не так по пути, я просто не могу понять, почему это вдруг перестало работать (это побочный проект, и в последний раз я работал над ним ~ 1 неделя go, эта проблема никогда не возникала.
РЕДАКТИРОВАТЬ
Для тех, кто испытывает это, я так и не нашел четкой причины, почему. Я обновил свою библиотеку 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);
}
});
}
}
);
},
Кроме того, я ничего не изменил, и он начал работать, и с тех пор этого не происходило.