Skip to content

Commit 3dbb19f

Browse files
fix(nuxt): preserve multiple set-cookie headers
1 parent 9c5e93c commit 3dbb19f

3 files changed

Lines changed: 40 additions & 1 deletion

File tree

.changeset/calm-cookies-wait.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/nuxt': patch
3+
---
4+
5+
Preserve every cookie directive returned while authenticating server requests.

packages/nuxt/src/runtime/server/__tests__/clerkMiddleware.test.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,34 @@ describe('clerkMiddleware(params)', () => {
113113
expect(await response.json()).toEqual(SESSION_AUTH_RESPONSE);
114114
});
115115

116+
test('preserves multiple Set-Cookie headers returned by authenticateRequest', async () => {
117+
const authHeaders = new Headers();
118+
const cookies = [
119+
'__clerk_handshake=; Path=/; Max-Age=0; HttpOnly; SameSite=Lax',
120+
'__session=refreshed; Path=/; HttpOnly; SameSite=Lax',
121+
];
122+
cookies.forEach(cookie => authHeaders.append('set-cookie', cookie));
123+
authHeaders.set('x-clerk-auth-status', 'signed-in');
124+
authenticateRequestMock.mockResolvedValueOnce({
125+
toAuth: () => SESSION_AUTH_RESPONSE,
126+
headers: authHeaders,
127+
});
128+
129+
const app = createApp();
130+
const handler = toWebHandler(app);
131+
app.use(clerkMiddleware());
132+
app.use(
133+
'/',
134+
eventHandler(event => event.context.auth()),
135+
);
136+
137+
const response = await handler(new Request(new URL('/', 'http://localhost')));
138+
139+
expect(response.status).toBe(200);
140+
expect(response.headers.getSetCookie()).toEqual(cookies);
141+
expect(response.headers.get('x-clerk-auth-status')).toBe('signed-in');
142+
});
143+
116144
test('executes handler and renders route when used with a custom handler', async () => {
117145
const app = createApp();
118146
const handler = toWebHandler(app);

packages/nuxt/src/runtime/server/clerkMiddleware.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,15 @@ export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]) => {
136136
}
137137

138138
if (requestState.headers) {
139+
const setCookieHeaders = requestState.headers.getSetCookie();
139140
requestState.headers.forEach((value, key) => {
140-
setResponseHeader(event, key, value);
141+
if (key.toLowerCase() !== 'set-cookie') {
142+
setResponseHeader(event, key, value);
143+
}
141144
});
145+
if (setCookieHeaders.length > 0) {
146+
setResponseHeader(event, 'set-cookie', setCookieHeaders);
147+
}
142148
}
143149

144150
const authObjectFn = (opts?: PendingSessionOptions) => requestState.toAuth(opts);

0 commit comments

Comments
 (0)