Skip to content

Commit c485044

Browse files
authored
Merge pull request #303 from auth0/cookie-cleanup
We should cleanup unused cookies when switching between chunked and unchunked
2 parents 5c5bb8d + af6f210 commit c485044

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

src/auth0-session/cookie-store.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,11 @@ export default class CookieStore {
160160
cookie: { transient, ...cookieConfig },
161161
name: sessionName
162162
} = this.config.session;
163+
const cookies = getCookies(req);
163164

164165
if (!session) {
165166
debug('clearing all matching session cookies');
166-
for (const cookieName of Object.keys(getCookies(req))) {
167+
for (const cookieName of Object.keys(cookies)) {
167168
if (cookieName.match(`^${sessionName}(?:\\.\\d)?$`)) {
168169
clearCookie(res, cookieName, {
169170
domain: cookieConfig.domain,
@@ -196,8 +197,22 @@ export default class CookieStore {
196197
const chunkCookieName = `${sessionName}.${i}`;
197198
setCookie(res, chunkCookieName, chunkValue, cookieOptions);
198199
}
200+
if (sessionName in cookies) {
201+
clearCookie(res, sessionName, {
202+
domain: cookieConfig.domain,
203+
path: cookieConfig.path
204+
});
205+
}
199206
} else {
200207
setCookie(res, sessionName, value, cookieOptions);
208+
for (const cookieName of Object.keys(cookies)) {
209+
if (cookieName.match(`^${sessionName}\\.\\d$`)) {
210+
clearCookie(res, cookieName, {
211+
domain: cookieConfig.domain,
212+
path: cookieConfig.path
213+
});
214+
}
215+
}
201216
}
202217
}
203218
}

tests/auth0-session/cookie-store.test.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,37 @@ describe('CookieStore', () => {
148148
await expect(get(baseURL, '/session', { cookieJar })).rejects.toThrowError('Unauthorized');
149149
});
150150

151+
it('should clean up single cookie when switching to chunked', async () => {
152+
const baseURL = await setup(defaultConfig);
153+
const appSession = encrypted({
154+
big_claim: randomBytes(2000).toString('base64')
155+
});
156+
expect(appSession.length).toBeGreaterThan(4000);
157+
const cookieJar = toCookieJar({ appSession }, baseURL);
158+
const session = await get(baseURL, '/session', { cookieJar });
159+
expect(session.claims).toHaveProperty('big_claim');
160+
const cookies = fromCookieJar(cookieJar, baseURL);
161+
expect(cookies).toHaveProperty(['appSession.0']);
162+
expect(cookies).not.toHaveProperty('appSession');
163+
});
164+
165+
it('should clean up chunked cookies when switching to a single cookie', async () => {
166+
const baseURL = await setup(defaultConfig);
167+
const appSession = encrypted({ sub: 'foo' });
168+
const cookieJar = toCookieJar(
169+
{
170+
'appSession.0': appSession.slice(0, 100),
171+
'appSession.1': appSession.slice(100)
172+
},
173+
baseURL
174+
);
175+
const session = await get(baseURL, '/session', { cookieJar });
176+
expect(session.claims).toHaveProperty('sub');
177+
const cookies = fromCookieJar(cookieJar, baseURL);
178+
expect(cookies).toHaveProperty('appSession');
179+
expect(cookies).not.toHaveProperty(['appSession.0']);
180+
});
181+
151182
it('should set the default cookie options on http', async () => {
152183
const baseURL = await setup(defaultConfig);
153184
const appSession = encrypted();

0 commit comments

Comments
 (0)