Skip to content

Commit 24e791e

Browse files
committed
add redis for sessions
1 parent 3463fed commit 24e791e

7 files changed

Lines changed: 199 additions & 51 deletions

File tree

package-lock.json

Lines changed: 106 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@
1919
"start": "node ./src/app.js"
2020
},
2121
"dependencies": {
22-
"cookie-parser": "^1.4.7",
22+
"connect-redis": "^9.0.0",
2323
"ejs": "^3.1.10",
2424
"express": "^4.21.1",
25-
"express-session": "^1.18.1",
25+
"express-session": "^1.18.2",
2626
"passport": "^0.7.0",
2727
"passport-oauth2": "^1.8.0",
28+
"redis": "^5.10.0",
2829
"uuid": "^13.0.0",
2930
"ws": "^8.18.3"
3031
}

src/app.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const express = require("express")
22
const log = require("./utils/logger")
3+
const db = require("./db")
34
const env = require("./env")
45
const http = require("http")
56

@@ -15,6 +16,8 @@ if (log.logger.level != env.ENV.logLevel) {
1516
log.Init(env.ENV.logLevel)
1617
}
1718

19+
db.Init()
20+
1821
app.use(express.static("public"))
1922

2023
app.set("view engine", "ejs")

src/auth.js

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,22 @@ const express = require("express")
22
const router = express.Router()
33

44
const session = require("express-session")
5-
const cookieParser = require("cookie-parser")
65

76
const passport = require("passport")
87
const OAuth2Strategy = require("passport-oauth2")
98

109
const { ENV } = require("./env")
1110
const { logger } = require("./utils/logger")
1211

12+
const {
13+
redisClient,
14+
GetFromCache,
15+
WriteToCache,
16+
DeleteFromCache,
17+
} = require("db")
18+
const connectRedis = require("connect-redis")
19+
const RedisStore = connectRedis(session)
20+
1321
const redirectURL = new URL(ENV.redirectURL)
1422

1523
async function fetchUserInfo(accessToken) {
@@ -71,47 +79,37 @@ passport.use(
7179
passport.serializeUser((user, done) => done(null, user))
7280
passport.deserializeUser((user, done) => done(null, user))
7381

74-
router.use(cookieParser(ENV.cookieKey))
75-
7682
router.use(
7783
session({
78-
secret: ENV.sessionKey,
84+
store: new RedisStore({ redisClient }),
85+
secret: process.env.SESSION_SECRET,
7986
resave: false,
8087
saveUninitialized: false,
8188
cookie: {
82-
httpOnly: true,
8389
secure: true,
84-
sameSite: "lax",
85-
maxAge: 1000 * 60 * 15,
90+
maxAge: 1000 * 60 * 60,
8691
},
8792
})
8893
)
8994

9095
router.use(passport.initialize())
9196
router.use(passport.session())
9297

93-
router.get("/", (req, res) => {
94-
if (req.query.serviceUrl) {
95-
res.cookie("serviceUrl", req.query.serviceUrl, {
96-
domain: redirectURL.hostname,
97-
httpOnly: true,
98-
secure: true,
99-
sameSite: "lax",
100-
maxAge: 300000,
101-
})
102-
}
98+
router.get("/", async (req, res) => {
99+
const key = `service=${req.sessionID}`
103100

104-
logger.debug(
105-
`Client requested ${req.hostname}, redirecting to ${redirectURL.hostname}`
106-
)
101+
const serviceUrl = await GetFromCache(key)
107102

108103
if (req.hostname !== redirectURL.hostname) {
109104
const originalHost = req.headers["x-forwarded-host"] || req.get("host")
110105
const originalProto = req.headers["x-forwarded-proto"] || req.protocol
111106
const originalUri = req.headers["x-forwarded-uri"] || req.originalUrl
112107

113108
const originalUrl = `${originalProto}://${originalHost}${originalUri}`
114-
return res.redirect(`${redirectURL.origin}?serviceUrl=${originalUrl}`)
109+
110+
await WriteToCache(key, originalUrl)
111+
112+
return res.redirect(`${redirectURL.origin}`)
115113
}
116114

117115
if (!req.isAuthenticated()) {
@@ -124,7 +122,7 @@ router.get("/", (req, res) => {
124122
locale: req.user.locale,
125123
email: req.user.email,
126124
},
127-
redirect: redirectURL.toString(),
125+
service: serviceUrl,
128126
})
129127
})
130128

src/db.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
const { ENV } = require("./env")
2+
const { logger } = require("./utils/logger")
3+
4+
const redis = require("redis")
5+
6+
let redisClient
7+
8+
async function Init() {
9+
redisClient = redis.createClient({
10+
url: `redis://${ENV.redisHost}:${ENV.redisPort}`,
11+
})
12+
13+
redisClient.on("error", (err) => logger.error("Redis error: ", err))
14+
15+
await redisClient.connect()
16+
17+
logger.debug("Connected to Redis")
18+
}
19+
20+
async function GetFromCache(key, { hash = false } = {}) {
21+
if (hash) {
22+
return await redisClient.hGetAll(key)
23+
} else {
24+
return await redisClient.get(key)
25+
}
26+
}
27+
28+
async function WriteToCache(key, value, { hash = false } = {}) {
29+
if (hash) {
30+
await redisClient.hSet(key, value)
31+
} else {
32+
await redisClient.set(key, value)
33+
}
34+
35+
await redisClient.expire(key, 3600)
36+
}
37+
38+
async function DeleteFromCache(key, { hash = false } = {}) {
39+
if (hash) {
40+
await redisClient.hDel(key)
41+
} else {
42+
await redisClient.del(key)
43+
}
44+
}
45+
46+
module.exports = {
47+
redisClient,
48+
Init,
49+
GetFromCache,
50+
WriteToCache,
51+
DeleteFromCache,
52+
}

src/env.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,18 @@ const ENV = {
88
logLevel: "info",
99
exposeLogs: true,
1010

11+
redisHost: "redis",
12+
redisPort: "6379",
13+
redisUser: "wol",
14+
redisPassword: "",
15+
1116
woldQueryPattern: "",
1217
wolURL: "",
1318

1419
woldPort: "7777",
1520
vePort: "9999",
1621

1722
sessionKey: "",
18-
cookieKey: "",
1923

2024
authorizationURL: "",
2125
resourceURL: "",
@@ -40,6 +44,11 @@ function Load() {
4044
ENV.port = process.env.PORT || ENV.port
4145
ENV.logLevel = process.env.LOG_LEVEL || ENV.logLevel
4246

47+
ENV.redisHost = process.env.REDIS_HOST || ENV.redisHost
48+
ENV.redisPort = process.env.REDIS_PORT || ENV.redisPort
49+
ENV.redisUser = process.env.REDIS_USER || ENV.redisUser
50+
ENV.redisPassword = process.env.REDIS_PASSWORD || ENV.redisPassword
51+
4352
ENV.woldQueryPattern = process.env.WOLD_QUERY_PATTERN || ""
4453

4554
ENV.exposeLogs = process.env.EXPOSE_LOGS || ENV.exposeLogs
@@ -54,14 +63,10 @@ function Load() {
5463
}
5564

5665
ENV.sessionKey = process.env.SESSION_KEY || ""
57-
ENV.cookieKey = process.env.COOKIE_KEY || ""
5866

5967
if (!ENV.sessionKey) {
6068
logger.fatal("No session key provided")
6169
}
62-
if (!ENV.cookieKey) {
63-
logger.fatal("No cookie key provided")
64-
}
6570

6671
ENV.authorizationURL = process.env.AUTHORIZATION_URL || ""
6772
ENV.resourceURL = process.env.RESOURCE_URL || ""

0 commit comments

Comments
 (0)