Redis集成异常:接入后Access Token失效且Redis无法初始化
GitHub Passport应用添加Redis会话存储后初始化失败
原本正常运行的GitHub Passport策略应用,在引入Redis存储会话令牌后出现错误,Redis无法完成初始化。
错误信息
Redis连接失败,相关报错见截图(原链接已移除)
依赖配置
{ "name": "employee-directory", "version": "1.0.0", "description": "", "main": "server.js", "scripts": { "start": "node server.js", "seed": "node db/seeds.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "connect-redis": "^6.1.3", "dotenv": "^8.2.0", "express": "^4.17.1", "express-session": "^1.17.3", "helmet": "^5.1.0", "multer": "^1.4.5-lts.1", "passport": "^0.6.0", "passport-github2": "^0.1.12", "pg": "^8.5.1", "redis": "^4.2.0" } }
Redis配置文件
const redis = require('redis'); require('dotenv').config(); const redisClient = redis.createClient({ port: process.env.REDPORT }); redisClient.on('error', function (err) { console.log('Could not establish a connection with redis. ' + err); }); redisClient.on('connect', function (err) { console.log('Connected to redis successfully'); }); module.exports = redisClient;
session.js 配置
require('dotenv').config(); const session = require('express-session'); const crypto = require('crypto'); const RedisStore = require('connect-redis')(session); const redisClient = require('./redis'); const serverSession = session({ genid: function (req) { return crypto.randomBytes(32).toString('hex'); }, store: new RedisStore({ client: redisClient }), resave: false, saveUninitialized: false, secret: process.env.SESSION_SECRET, cookie: { maxAge: 600000, secure: false }, }); module.exports = serverSession;
passport.js 配置
require('dotenv').config(); const passport = require('passport'); const { Person } = require('../models'); const GitHubStrategy = require('passport-github2').Strategy; const { hash } = require('../utils/crypto'); passport.serializeUser((user, done) => { done(null, user); }); passport.deserializeUser((user, done) => { done(null, user); }); passport.use( new GitHubStrategy( { clientID: process.env.GITHUB_CLIENT_ID, clientSecret: process.env.GITHUB_CLIENT_SECRET, callbackURL: process.env.GITHUB_CLIENT_CALLBACK_URL, }, async function (accessToken, refreshToken, profile, done) { try { const hashedId = hash(profile.id.toString()); const { rowCount, rows } = await Person.findUser({ github_id: hashedId }); if (rowCount > 0) { return done(null, rows[0]); } else { return done(null, { github_id: hashedId }); } } catch (err) { console.log(err); } } ) );
server.js 入口文件
require('dotenv').config(); const express = require('express'); const path = require('path'); const helmet = require('helmet'); const passport = require('passport'); const routes = require('./controllers'); const ContentSecurityPolicy = require('./config/helmet'); const serverSession = require('./config/session'); const hotlink = require('./utils/hotlink'); const app = express(); const PORT = process.env.PORT || 3001; require('./config/passport'); app.use(express.json()); app.use(express.urlencoded({ extended: true })); // Enable the content security policy app.use(ContentSecurityPolicy); app.use( helmet.referrerPolicy({ policy: 'no-referrer', }) ); app.use(helmet.noSniff()); // enable this if you run behind a proxy (e.g. nginx) // app.set('trust proxy', 1); app.use(serverSession); app.use(passport.initialize()); app.use(passport.session()); app.use(hotlink); app.use(express.static(path.join(__dirname, '/public'))); // turn on routes app.use(routes); app.listen(PORT, () => { console.log(`Server started on port: ${PORT}`); });
本人仍在学习阶段,若问题描述有疏漏请见谅,如需更多信息可告知。
内容的提问来源于stack exchange,提问作者ifeasome
相关产品推荐
相关产品推荐

