【发布时间】:2017-08-01 06:29:09
【问题描述】:
我正在尝试使用 express-session 来跟踪 arcade.ly 上的用户会话。我没有为genid 指定值,因为我很高兴(目前)坚持使用默认的 ID 生成。问题是没有为我的会话生成 ID。
这是我在服务器实现中通过字符串化req.session 捕获的示例:
info: Session info: {"cookie":{"originalMaxAge":31535989265,"expires":"2018-07-31T21:30:05.827Z","secure":false,"httpOnly":true,"path":"/","sameSite":"lax"}}
如您所见,除了没有 ID 之外,一切都很好。我绝对需要一个 ID,因为我希望能够将某些信息(例如用户开始游戏、结束游戏、他们的最终得分)与该会话相关联,并且无论如何我都希望将其关联他们是否登录。
如果他们选择稍后登录以记录他们的分数,那么我可以将该登录与他们的会话相关联,但强制他们预先登录作为用户体验很糟糕。
我的代码如下所示:
let cookieExpiry = new Date();
cookieExpiry.setFullYear(cookieExpiry.getFullYear() + 1);
let sessionOptions = {
cookie: {
path: '/',
httpOnly: true,
secure: false,
maxAge: null,
expires: cookieExpiry,
sameSite: 'lax',
},
name: 'arcadely.sid',
resave: false,
saveUninitialized: false,
secret: sessionSecret.secret
};
// In production we want to use secure cookies
if (!debugging.isDebugging()) {
app.set('trust proxy', 1); // Required for secure cookie to work behind Cloudflare
sessionOptions.cookie.secure = true;
sessionOptions.proxy = true;
}
app.use(session(sessionOptions));
app.use(cookieParser());
app.use(bodyParser.json());
// app.use(passport.initialize());
// app.use(passport.session());
// Dynamic content
app.get('/', homepages.serveOrRedirect);
app.get(/^\/star-castle\/?$/, (req, res) => { res.redirect(301, '/games/starcastle/'); });
app.get(/^\/games\/asteroids\/?$/, games.loadAsteroids);
app.get(/^\/games\/space-invaders\/?$/, games.loadSpaceInvaders);
app.get(/^\/games\/starcastle\/?$/, games.loadStarCastle);
请记住,我是在网站的调试版本中查看此内容,为什么我在会话对象中看不到任何会话 ID?如果它没有存储在那里,它存储在哪里,我如何获得它?
(护照的东西是因为最终我想插入护照登录,但是现在,我已经将其注释掉只是为了从查询中消除它。另外,sessionSecret.secret 只是一个很大的随机字符串为方便起见,存储在另一个文件中。)
非常感谢任何帮助。
非常感谢,
巴特
【问题讨论】:
-
听起来您可能需要
uuid。尝试在 npmjs.org 上查找uuidv4。您可以要求将软件包放入并执行sessionID = uuidv4()并根据需要使用。我不确定这是否是您需要的。 -
谢谢 - 我必须承认我很想尝试提供一个自定义的
genid实现,使用uuid或类似的东西,只是为了检查这是否真的是问题所在。根据文档,理论上它不应该是这样,但是文档总是有点过时了,对吧?早上一个,我想。
标签: javascript node.js express express-session