对 Express-session 中间件的普遍疑问

问题描述 投票:0回答:1

我是一个完全的网络初学者,我有很多稳定的疑问,希望你不介意回答。

问题 1:先生,我的 MongoDB 存储如何在 max-age 或到期时间后清除会话? connect-mongo 的驱动程序是否有一些异步函数,每当会话过期时就会作为事件调用,或者 MongoDB 服务器对于会话收集有特殊含义,或者 MongoDB 有内置方法在某些异步的帮助下执行此操作功能和全部?我出于学习目的手动实现了这个,这很有趣,但是在 Express 会话部分中这是如何发生的,我感到惊讶和非常困惑。谁来处理过期的事情?

问题2:先生,我不明白重新保存的事情。我做了很多谷歌搜索并了解了 resave 和 saveUninitialsied。我知道 saveUninitialized 是什么意思。它表示除非 cookie 被修改,否则不要保存新会话。很酷的事情。然后人们继续在 StackOverflow 上解释重新保存和触摸方法,但我没有从那里得到。如果数据库没有初始化 touch 命令,这意味着什么?重新保存和其他事情也发生在数据库上或从我的服务器的命令到数据库。这是我对数据库的服务器命令,对吗?或者幕后发生了一些事情。

问题3:先生,如果我想在快速会话中向用户发送超过1个cookie,是否可能,这是专业做法吗?或者我应该使用 cookie 解析和 res.cookie 来发送超过 1 个 cookie?另外,我可以将 connect.sid 的名称更改为其他名称吗?这是我的下一个问题?

Ques4:先生,我想知道是否可以在 cookie 中存储更多的键值对作为键和 JSON,所以我做了类似的事情,但据我检查,数据并未存储在 MongoDB 中。那么cookie中存储的是数据吗?

//creating the session
app.use(session({
    name: 'auth cookie', //Name of the cookie
    store: new MongoStore({ mongooseConnection: mongoose.connection }), //To store session-store as Mongoose,
    secret: process.env.COOKIE_SECRET, //Used to sign the cookie
    saveUninitialized: false, //If the user bounces off, don't create a session
    resave: false, //Touch method is implemented by MongoDB. I want to know more about this option
    cookie: {
        path: '/', //Where the cookies would be saved
        httpOnly: true, //Javascript on client cannot get access to cookies. Good for security.
        secure: false, //http service. Not strictly HSTS or HTTPS
        maxAge: 60*1000, //1 minute
        sameSite: true, //No XSRF
        name: 'Hobbit Holet', //This is how values are stored in the cookie for furture use
        age: '21' //This is how values are stored in the cookie for furture use
    }
}));

问题 5:先生,如您所见,我有一个秘密。现在我可以在浏览器上看到 cookie。现在 cookie 有了一些数据,我也有了密钥。因此,出于调试目的并且仅在开发模式下,有没有办法可以通过我在这里拥有的密钥解密 cookie 内的数据?如果有办法,请在发送之前分享用于散列或加密数据的算法。

谢谢大家,如果我写错了什么或者在提出问题时犯了任何错误,我和每个人都愿意接受建设性的批评。我希望得到帮助,因为我今天被困在这里。

mongodb express session cookies express-session
1个回答
0
投票

问题1:connect-mongo 的驱动程序是否有一些异步函数,每当会话过期时就会作为事件调用

不,mongoDB支持创建TIL(生存时间)索引。因此,当您使用“connect-mongo”模块设置

maxAge
时,它会设置该会话字段的 TIL 索引。 mongoDB 在指定时间后自动删除该字段

问题2:如果数据库没有初始化touch命令,这意味着什么

如果

saveUninitialized
true
,则在将某些属性附加到会话之前,不会创建会话(对于任何用户)。

如果

resave
true
,则每当用户向服务器发送请求时,express session 都会在存储/数据库中重新保存(即清除会话并重新保存)会话。

因为某些数据库会在一段时间后清除您的会话(存储在数据库中)。因此,如果您的数据库(例如 mongoDB)支持 touch 命令,那么express session 默认情况下会阻止它,但是如果数据库不支持 touch 命令,那么最好在一段时间后重新保存会话,这样它就不会在执行之前被删除。指定到期时间。

问题3:我应该使用 cookie 解析和 res.cookie 来发送超过 1 个 cookie 吗?另外,我可以将 connect.sid 的名称更改为其他名称吗

您无法为单个用户发送多个 sessionId cookie。如果你想发送一些其他cookie,那么你可以使用

res.cookie
方法来做到这一点,但最好将所有用户相关数据存储在会话中

您可以使用

connect.sid
选项将默认的
name
cookie 名称更改为任何名称。

例如:

app.use(session({
  secret: "🦍",
  name: 'sessionId', // default is connect.sid
  ...
}))

问题4:但据我检查,数据并未存储在MongoDB中

  1. 定义会话选项时不要指定任何用户数据。
  2. cookie 属性(在会话选项中)用于存储将存储在用户浏览器中的 sessionId cookie 的 cookie 属性。
  3. 要将数据存储到会话中,请将其添加到会话属性本身

例如:

req.session.name = 'Hobbit Holet',
age = '21'

问题5:有没有办法可以通过密钥解密cookie中的数据

sessionId cookie 不包含任何用户数据,用户数据存储在会话中(在服务器端)。即使你解码cookie(存储在用户的浏览器中),它也将是一个无用的随机字符串

© www.soinside.com 2019 - 2024. All rights reserved.