Skip to content

Commit a9f0479

Browse files
refactor cookie serialization
1 parent 3254c61 commit a9f0479

File tree

3 files changed

+12
-15
lines changed

3 files changed

+12
-15
lines changed

pages/new/index.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
} from "../../src/utils/csrfUtils";
1616
import * as cookie from "../../src/utils/CookieUtils";
1717

18-
import { serialize } from "cookie";
1918
import { GetServerSideProps } from "next";
2019
import { useTranslation } from "next-i18next";
2120
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
@@ -75,12 +74,13 @@ export const getServerSideProps: GetServerSideProps = async (context) => {
7574
if (!csrfToken) {
7675
csrfToken = generateNewToken();
7776
const newTokenCookieString = generateNewCookieTokenAndHash(csrfToken);
78-
newTokenCookie = serialize(
77+
newTokenCookie = cookie.buildCookieHeader(
7978
cookie.metadata().csrfToken.name,
8079
newTokenCookieString,
8180
cookie.metadata().csrfToken.options
8281
);
8382
}
83+
8484
const headers = [
8585
// reset cookie that would otherwise bump users out of the flow
8686
// to succcess page

src/utils/CookieUtils.ts

+9-7
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ import { serialize } from "cookie";
55
* Function to set cookies on the server side based on with minor updates:
66
* https://github.com/vercel/next.js/blob/master/examples/api-routes-middleware/utils/cookies.js
77
*/
8-
const set = (res, name, value, options) => {
8+
const set = (res, value) => {
9+
const cookie = buildCookieHeader(value);
10+
return res.setHeader("Set-Cookie", cookie);
11+
};
12+
13+
const buildCookieHeader = (value) => {
14+
const { name, options } = metadata().csrfToken;
915
const stringValue =
1016
typeof value === "object" ? "j:" + JSON.stringify(value) : String(value);
11-
12-
return res.setHeader(
13-
"Set-Cookie",
14-
serialize(name, String(stringValue), options)
15-
);
17+
return serialize(name, String(stringValue), options);
1618
};
1719

1820
// Use secure cookies if the site uses HTTPS
@@ -43,4 +45,4 @@ const metadata = () => {
4345
};
4446
};
4547

46-
export { set, metadata };
48+
export { set, metadata, buildCookieHeader };

src/utils/csrfUtils.ts

+1-6
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,7 @@ const postRequestHashMatchesServerHash = (tokenFromRequestCookie) => {
7272
// Used as part of the strategy for mitigation for CSRF tokens.
7373
const setCsrfTokenCookie = (res, csrfToken) => {
7474
const newCsrfTokenCookie = generateNewCookieTokenAndHash(csrfToken);
75-
cookie.set(
76-
res,
77-
cookie.metadata().csrfToken.name,
78-
newCsrfTokenCookie,
79-
cookie.metadata().csrfToken.options
80-
);
75+
cookie.set(res, newCsrfTokenCookie);
8176
};
8277

8378
const generateNewToken = () => {

0 commit comments

Comments
 (0)