Skip to content

Commit b39acaf

Browse files
committed
improve session_id management, use state instead of query
1 parent a4efb8d commit b39acaf

3 files changed

Lines changed: 32 additions & 14 deletions

File tree

src/auth.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { logger } from "./utils/logger.js"
1212

1313
import {
1414
redisClient,
15-
GetFromCache,
15+
ReadFromCache,
1616
WriteToCache,
1717
DeleteFromCache,
1818
} from "./db.js"
@@ -112,8 +112,18 @@ function registerOauth() {
112112
router.use(passport.session())
113113

114114
router.get("/", async (req, res, next) => {
115-
if (req.query.session_id) {
116-
res.cookie("session_id", req.query.session_id, {
115+
// auth.com => app.com
116+
if (req.query.state) {
117+
const state = req.query.state
118+
119+
const sessionID = await ReadFromCache(`oauth_state=${state}`)
120+
if (!sessionID) {
121+
return res.status(400).send("Invalid or expired oauth state")
122+
}
123+
124+
await DeleteFromCache(`oauth_state=${state}`)
125+
126+
res.cookie("session_id", sessionID, {
117127
domain: redirectURL.hostname,
118128
httpOnly: true,
119129
secure: true,
@@ -122,18 +132,22 @@ function registerOauth() {
122132
})
123133
}
124134

135+
// entry.com => app.com
125136
if (req.hostname !== redirectURL.hostname) {
126137
const originalUrl = getOriginalUrl(req)
127-
128-
logger.debug("Cached original url: " + originalUrl)
138+
logger.debug("Cached entrypoint: " + originalUrl)
129139

130140
const sessionID = uuidv4()
141+
const state = uuidv4()
131142

132143
await WriteToCache(`service=${sessionID}`, originalUrl)
133144

134-
return res.redirect(`${redirectURL.origin}/?session_id=${sessionID}`)
145+
await WriteToCache(`oauth_state=${state}`, sessionID, { expire: 600 })
146+
147+
return res.redirect(`${redirectURL.origin}/?state=${state}`)
135148
}
136149

150+
// app.com => auth.com
137151
if (!req.isAuthenticated()) {
138152
return res.redirect("/auth")
139153
}

src/db.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,26 @@ export async function Init() {
1919
logger.debug("Connected to Redis")
2020
}
2121

22-
export async function GetFromCache(key, { hash = false } = {}) {
22+
export async function ReadFromCache(key, { hash = false } = {}) {
2323
if (hash) {
2424
return await redisClient.hGetAll(key)
2525
} else {
2626
return await redisClient.get(key)
2727
}
2828
}
2929

30-
export async function WriteToCache(key, value, { hash = false } = {}) {
30+
export async function WriteToCache(
31+
key,
32+
value,
33+
{ hash = false, expire = 3600 } = {}
34+
) {
3135
if (hash) {
3236
await redisClient.hSet(key, value)
3337
} else {
3438
await redisClient.set(key, value)
3539
}
3640

37-
await redisClient.expire(key, 3600)
41+
await redisClient.expire(key, expire)
3842
}
3943

4044
export async function DeleteFromCache(key, { hash = false } = {}) {

src/wol.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { ENV } from "./env.js"
77
import request from "./utils/request.js"
88

99
import * as wss from "./wss.js"
10-
import { GetFromCache, DeleteFromCache } from "./db.js"
10+
import { ReadFromCache, DeleteFromCache } from "./db.js"
1111

1212
const router = express.Router()
1313

@@ -335,7 +335,7 @@ async function startProcessing(req, res) {
335335
}
336336

337337
const key = `service=${sessionID}`
338-
const originalUrl = await GetFromCache(key)
338+
const originalUrl = await ReadFromCache(key)
339339

340340
await DeleteFromCache(key)
341341

@@ -441,11 +441,11 @@ export function Router() {
441441
}
442442

443443
router.get("/", async (req, res, next) => {
444-
if (!req.session) {
445-
return res.status(500).send("Bad Request: Missing session_id")
444+
if (!req.cookies.session_id) {
445+
return res.redirect("/auth")
446446
}
447447

448-
const serviceUrl = await GetFromCache(`service=${req.query.session_id}`)
448+
const serviceUrl = await ReadFromCache(`service=${req.cookies.session_id}`)
449449

450450
return res.render("home", {
451451
user: {

0 commit comments

Comments
 (0)