Проверка Jsonwebtoken вызывает NGINX тайм-аут - PullRequest
0 голосов
/ 02 февраля 2020

Общий технический стек для приложения, над которым я работаю, - 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);
                    }
                });
            }
        }
    );
},

Кроме того, я ничего не изменил, и он начал работать, и с тех пор этого не происходило.

...