Skip to content

Commit 440d8a5

Browse files
kaytwoascorbicematipico
authored
fix: session regeneration (#12864)
Co-authored-by: Matt Kane <[email protected]> Co-authored-by: Emanuele Stoppa <[email protected]>
1 parent 8809b85 commit 440d8a5

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

.changeset/hot-baboons-own.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'astro': patch
3+
---
4+
5+
Fixes a bug where the session ID wasn't correctly regenerated

packages/astro/src/core/session.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,8 @@ export class AstroSession<TDriver extends SessionDriverName = any> {
182182
const oldSessionId = this.#sessionID;
183183

184184
// Create new session
185-
this.#sessionID = undefined;
185+
this.#sessionID = crypto.randomUUID();
186186
this.#data = data;
187-
this.#ensureSessionID();
188187
await this.#setCookie();
189188

190189
// Clean up old session asynchronously

packages/astro/test/sessions.test.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import assert from 'node:assert/strict';
2+
import { before, describe, it } from 'node:test';
3+
import testAdapter from './test-adapter.js';
4+
import { loadFixture } from './test-utils.js';
5+
6+
describe('Astro.session', () => {
7+
/** @type {import('./test-utils').Fixture} */
8+
let fixture;
9+
10+
before(async () => {
11+
fixture = await loadFixture({
12+
root: './fixtures/sessions/',
13+
output: 'server',
14+
adapter: testAdapter(),
15+
});
16+
});
17+
18+
describe('Production', () => {
19+
let app;
20+
before(async () => {
21+
await fixture.build();
22+
app = await fixture.loadTestAdapterApp();
23+
});
24+
25+
async function fetchResponse(path, requestInit) {
26+
const request = new Request('http://example.com' + path, requestInit);
27+
const response = await app.render(request);
28+
return response;
29+
}
30+
31+
it('can regenerate session cookies upon request', async () => {
32+
const firstResponse = await fetchResponse('/regenerate', { method: 'GET' });
33+
const firstHeaders = Array.from(app.setCookieHeaders(firstResponse));
34+
const firstSessionId = firstHeaders[0].split(';')[0].split('=')[1];
35+
36+
const secondResponse = await fetchResponse('/regenerate', {
37+
method: 'GET',
38+
headers: {
39+
cookie: `astro-session=${firstSessionId}`,
40+
},
41+
});
42+
const secondHeaders = Array.from(app.setCookieHeaders(secondResponse));
43+
const secondSessionId = secondHeaders[0].split(';')[0].split('=')[1];
44+
assert.notEqual(firstSessionId, secondSessionId);
45+
});
46+
});
47+
});

0 commit comments

Comments
 (0)