简体   繁体   English

快速会话重置为每个请求

[英]Express session reset for every request

I am trying to use session variables in express to manage user sign in. I can't get the variable to work over different requests. 我试图在Express中使用会话变量来管理用户登录。我无法使该变量适用于不同的请求。 Here is my code: 这是我的代码:

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);
});

The variables are properly stored the first time, but when I redirect to the home page, req.session.test and req.session.use are undefined. 第一次正确存储了变量,但是当我重定向到主页时, req.session.testreq.session.use是未定义的。

Here's the code for that: 这是该代码:

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,
    });
});

I'm using: 我正在使用:

  • Express 4.16 快递4.16
  • express-session 1.15.6 快速会议1.15.6
  • cookie-parser 1.4.3. cookie解析器1.4.3。

EDIT: 编辑:

My website is using SSL, so my cookie should have secure:true . 我的网站使用SSL,因此我的cookie应该具有secure:true

UPDATE: 更新:

I tried moving res.sendStatus(200) so that the method now looks like this: 我尝试移动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);
    });
});

and got the same result. 并得到相同的结果。

Try to change cookie: { secure: true } to false, because according to the Doc: 尝试将cookie: { secure: true }更改为false,因为根据文档:

Note be careful when setting this to true, as compliant clients will not send the cookie back to the server in the future if the browser does not have an HTTPS connection. 将其设置为true时请注意 ,因为如果浏览器没有HTTPS连接,则兼容的客户端将来不会将cookie发送回服务器。

Please note that secure: true is a recommended option. 请注意,安全:true是推荐的选项。 However, it requires an https-enabled website, ie, HTTPS is necessary for secure cookies. 但是,它需要启用HTTPS的网站,即HTTPS对于安全cookie是必需的。 If secure is set, and you access your site over HTTP, the cookie will not be set. 如果设置了安全性,并且您通过HTTP访问站点,则不会设置cookie。

Code: 码:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM