Срочный сброс сеанса для каждого запроса - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь использовать переменные сеанса в экспрессе для управления входом пользователя. Я не могу заставить переменную работать над различными запросами.Вот мой код:

var config = require('config'),

    ejs = require('ejs'),

    util = require('util'),

    express = require('express'),
    bodyParser = require('body-parser'),
    cors = require('cors'),
    moment = require('moment'),
    plaid = require('plaid'),
    mariadb = require('mariadb'),

    fs = require('fs'),
    http = require('http'),
    https = require('https'),

    session = require('express-session'),
    cookieParser = require('cookie-parser');

...

var app = express();

app.use(cookieParser());
app.use(
    session({
        resave: false,
        saveUninitialized: false,
        secret: 'debug',
        cookie: { secure: true }
    })
);

...

app.post('/tokensignin', function (req, res) {
    async function verify() {
        const ticket = await googleAuthClient.verifyIdToken({
            idToken: req.body.idtoken,
            audience: GOOGLE_AUTH_CLIENT_ID,
        });
        const payload = ticket.getPayload();
        const userid = payload['sub'];
        if (payload['aud'] == GOOGLE_AUTH_CLIENT_ID) {
            pool.getConnection().then(conn => {
                conn.query("CALL getUserByGoogleId(?)", [userid])
                    .then(rows => {
                        res.sendStatus(200);
                        if (rows[0]) {
                            req.session.test = "Hello, world!";
                            console.log("req.session.test = " + req.session.test);
                            req.session.user = {
                                firstName: rows[0].firstName,
                                lastName: rows[0].lastName,
                                avatar: rows[0].imageUrl,
                            };
                        } else {
                            conn
                                .query("CALL createUser(?,?,?,?,?)) VALUES (?,?,?,?,?)"
                                    , [userid, req.body.firstName, req.body.lastName, req.body.imageUrl, req.body.email]
                                )
                                .then(rows => {
                                    req.session.user = {
                                        firstName: rows[0].firstName,
                                        lastName: rows[0].lastName,
                                        avatar: rows[0].imageUrl,
                                    };
                                })
                                .catch(err => {
                                    console.log("error: " + err);
                                    res.send(err);
                                });
                        }
                    })
                    .catch(err => {
                        res.send(err);
                    });
                conn.end();
            });
        }
    }
    verify().catch(console.error);
});

Переменные правильно сохраняются в первый раз, но когда я перенаправляю на домашнюю страницу, req.session.test и req.session.use не определены.

Воткод для этого:

app.all('/home', function (req, res) {
    console.log("req.session.test = " + req.session.test);
    console.log(req.session);
    return res.render('home.ejs', {
        PLAID_PUBLIC_KEY: PLAID_PUBLIC_KEY,
        PLAID_ENV: PLAID_ENV,
        PLAID_PRODUCTS: PLAID_PRODUCTS,
        APP_MODE: config.APP_MODE,
        APP_PORT: config.APP_PORT,
        URL: config.URL,
        test: req.session.test,
        user: req.session.user,
    });
});

Я использую:

  • Express 4.16
  • express-session 1.15.6
  • cookie-parser1.4.3.

РЕДАКТИРОВАТЬ:

Мой сайт использует SSL, поэтому мой cookie должен иметь secure:true.

ОБНОВЛЕНИЕ:

Я попытался переместить res.sendStatus(200), чтобы метод теперь выглядел так:

conn.query("CALL getUserByGoogleId(?)", [userid])
    .then(rows => {
        if (rows[0]) {
            req.session.test = "Hello, world!";
            console.log("req.session.test = " + req.session.test);
            req.session.user = {
                firstName: rows[0].firstName,
                lastName: rows[0].lastName,
                avatar: rows[0].imageUrl,
            };
        } else {
            conn.query("CALL createUser(?,?,?,?,?)) VALUES (?,?,?,?,?)"
                , [userid, req.body.firstName, req.body.lastName, req.body.imageUrl, req.body.email])
            .then(rows => {
                req.session.user = {
                    firstName: rows[0].firstName,
                    lastName: rows[0].lastName,
                    avatar: rows[0].imageUrl,
                };
            })
            .catch(err => {
                console.log("error: " + err);
                res.send(err);
            });
        }
        res.sendStatus(200);
        conn.end();
    })
    .catch(err => {
        res.send(err);
    });
});

и получил тот же результат.

1 Ответ

0 голосов
/ 15 февраля 2019

Попробуйте изменить cookie: { secure: true } на false, потому что в соответствии с Doc:

Примечание будьте осторожны при установке значения true, поскольку совместимые клиенты не будут отправлять cookieвернуться к серверу в будущем, если браузер не имеет HTTPS-соединения.

Обратите внимание, что secure: true - рекомендуемая опция.Однако для этого требуется веб-сайт с поддержкой https, т. Е. HTTPS необходим для безопасных файлов cookie.Если установлена ​​защита и вы получаете доступ к своему сайту по HTTP, файл cookie не будет установлен.

Код:

app.use(
    session({
        resave: false,
        saveUninitialized: false,
        secret: 'debug',
        cookie: { secure: false }
    })
);
...