我在我的应用程序上设置了一个PassportJS认证,包括Facebook、Twitter和Google以及本地的策略。下面是我的身份验证路由当前的样子:
// /routes/auth-routes.js
import connectRedis from 'connect-redis';
import express from 'express';
import session from 'express-session';
import uuidv4 from 'uuid/v4';
import facebook from './auth-providers/facebook';
import google from './auth-providers/google';
import local from './auth-providers/local';
import twitter from './auth-providers/twitter';
const RedisStore = connectRedis(session);
const router = express.Router();
router.use(session({
name: process.env.SESSION_COOKIE,
genid: () => uuidv4(),
cookie: {
httpOnly: true,
sameSite: 'strict',
},
secret: process.env.SESSION_SECRET,
store: new RedisStore({
host: process.env.REDIS_HOST,
port: process.env.REDIS_PORT,
ttl: 1 * 24 * 60 * 60, // In seconds
}),
saveUninitialized: false,
resave: false,
}));
// Social auth routes
router.use('/google', google);
router.use('/twitter', twitter);
router.use('/facebook', facebook);
router.use('/local', local);
// Logout
router.get('/logout', (req, res) => {
req.logout();
const cookieKeys = Object.keys(req.cookies);
if(cookieKeys.includes(process.env.USER_REMEMBER_COOKIE)) {
console.log('REMEMBER COOKIE EXISTS!');
const rememberCookie = process.env.USER_REMEMBER_COOKIE;
const sessionCookie = process.env.SESSION_COOKIE;
cookieKeys.forEach((cookie) => {
if(cookie !== rememberCookie && cookie !== sessionCookie) res.clearCookie(cookie);
});
res.redirect(req.query.callback);
} else {
console.log('NO REMEMBER');
req.session.destroy(() => {
cookieKeys.forEach((cookie) => {
res.clearCookie(cookie);
});
res.redirect(req.query.callback);
});
}
});
module.exports = router;
显然,我正在使用Redis存储会话cookie,然后将其连同所有其他cookie一起发送到服务器,然后在每个页面重新加载。我的问题是:
够了吗?我不应该通过查看Redis商店来验证接收到的会话cookie的完整性吗?但是,如果我在每次页面加载时都这样做,这不会对性能产生不利影响吗?处理这件事的标准方法是什么?
回购在https://github.com/amitschandillia/proost/blob/master/web。
发布于 2019-09-09 23:40:00
看起来,您缺少了与PassportJS的快速会话集成的一部分。与前面提到的注释一样,快捷会话将在redis存储中存储您的会话数据,其密钥将存储在发送给用户的cookie中。
但是您要通过passportJS登录用户,您需要将这两个中间件连接在一起。来自passportJS文档:
http://www.passportjs.org/docs/configure/
中间件 在基于连接或快捷的应用程序中,初始化Passport需要passport.initialize()中间件。如果应用程序使用持久登录会话,则还必须使用passport.session()中间件。
app.configure(function() {
app.use(express.static('public'));
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({ secret: 'keyboard cat' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
});
https://stackoverflow.com/questions/57752612
复制相似问题