【发布时间】:2019-03-26 21:01:31
【问题描述】:
我正在尝试使用 koa、koa-session、koa-redis 通过服务器端会话实现 Firebase 身份验证。
我就是无法理解。在阅读 koa-session 自述文件时,这对我来说特别神秘(link):
您可以将会话内容存储在外部存储(Redis、MongoDB 或其他 DB)中,方法是使用三个方法(这些方法必须是异步函数)传递 options.store:
get(key, maxAge, { rolling }): 按键获取会话对象
set(key, sess, maxAge, { rolling, changed }): 为key设置会话对象,maxAge(毫秒)
destroy(key): 销毁密钥会话
四处询问后,我这样做了:
// middleware/installSession.js
const session = require('koa-session');
const RedisStore = require('koa-redis');
const ONE_DAY = 1000 * 60 * 60 * 24;
module.exports = function installSession(app) {
app.keys = [process.env.SECRET];
app.use(session({
store: new RedisStore({
url: process.env.REDIS_URL,
key: process.env.REDIS_STORE_KEY,
async get(key) {
const res = await redis.get(key);
if (!res) return null;
return JSON.parse(res);
},
async set(key, value, maxAge) {
maxAge = typeof maxAge === 'number' ? maxAge : ONE_DAY;
value = JSON.stringify(value);
await redis.set(key, value, 'PX', maxAge);
},
async destroy(key) {
await redis.del(key);
},
})
}, app));
};
然后在我的主要server.js 文件中:
// server.js
...
const middleware = require('./middleware');
const app = new Koa();
const server = http.createServer(app.callback());
// session middleware
middleware.installSession(app);
// other middleware, which also get app as a parameter
middleware.installFirebaseAuth(app);
...
const PORT = parseInt(process.env.PORT, 10) || 3000;
server.listen(PORT);
console.log(`Listening on port ${PORT}`);
但是我如何从其他中间件中访问会话及其方法呢?就像在 installFirebaseAuth 中间件中一样,我想最终获取/设置会话值:
// installFirebaseAuth.js
...
module.exports = function installFirebaseAuth(app) {
...
const verifyAccessToken = async (ctx, next) => {
...
// trying to access the session, none work
console.log('ctx.session', ctx.session);
console.log('ctx.session.get():'
ctx.session.get(process.env.REDIS_STORE_KEY));
console.log('ctx.req.session', ctx.req.session);
const redisValue = await ctx.req.session.get(process.env.REDIS_STORE_KEY);
...
}
}
ctx.session 返回{}
ctx.session.get() 返回ctx.session.get is not a function
ctx.req.session 返回undefined
有什么线索吗? 谢谢!!
【问题讨论】:
-
我知道它有点旧,但您找到解决方案了吗?
-
不是真的,我前段时间放弃了 Koa....
-
与 express 相比,他们的文档是一场灾难。无论如何,谢谢你的回答。