🛠 feat: Enhance Redis Integration, Rate Limiters & Log Headers (#6462)

* feat: Implement Redis-based rate limiting, initially import limits

* feat: Enhance rate limiters with Redis support and custom prefixes

* chore: import orders

* chore: update JSDoc for next middleware parameter type in ban and limiter middleware

* feat: add logHeaders middleware to log forwarded headers in requests

* refactor: change log level from info to debug for Redis rate limiters

* feat: increase Redis max listeners and refactor session storage to use Keyv
This commit is contained in:
Danny Avila 2025-03-21 14:14:45 -04:00 committed by GitHub
parent e928a8eee4
commit cbba914290
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 337 additions and 63 deletions

View file

@ -1,4 +1,4 @@
const Redis = require('ioredis');
const Keyv = require('keyv');
const passport = require('passport');
const session = require('express-session');
const MemoryStore = require('memorystore')(session);
@ -12,6 +12,7 @@ const {
appleLogin,
} = require('~/strategies');
const { isEnabled } = require('~/server/utils');
const keyvRedis = require('~/cache/keyvRedis');
const { logger } = require('~/config');
/**
@ -19,6 +20,8 @@ const { logger } = require('~/config');
* @param {Express.Application} app
*/
const configureSocialLogins = (app) => {
logger.info('Configuring social logins...');
if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) {
passport.use(googleLogin());
}
@ -41,18 +44,17 @@ const configureSocialLogins = (app) => {
process.env.OPENID_SCOPE &&
process.env.OPENID_SESSION_SECRET
) {
logger.info('Configuring OpenID Connect...');
const sessionOptions = {
secret: process.env.OPENID_SESSION_SECRET,
resave: false,
saveUninitialized: false,
};
if (isEnabled(process.env.USE_REDIS)) {
const client = new Redis(process.env.REDIS_URI);
client
.on('error', (err) => logger.error('ioredis error:', err))
.on('ready', () => logger.info('ioredis successfully initialized.'))
.on('reconnecting', () => logger.info('ioredis reconnecting...'));
sessionOptions.store = new RedisStore({ client, prefix: 'librechat' });
logger.debug('Using Redis for session storage in OpenID...');
const keyv = new Keyv({ store: keyvRedis });
const client = keyv.opts.store.redis;
sessionOptions.store = new RedisStore({ client, prefix: 'openid_session' });
} else {
sessionOptions.store = new MemoryStore({
checkPeriod: 86400000, // prune expired entries every 24h
@ -61,7 +63,9 @@ const configureSocialLogins = (app) => {
app.use(session(sessionOptions));
app.use(passport.session());
setupOpenId();
logger.info('OpenID Connect configured.');
}
};
module.exports = configureSocialLogins;
module.exports = configureSocialLogins;