Skip to content

Commit cab971b

Browse files
committed
fix csrf
1 parent b91872c commit cab971b

File tree

6 files changed

+15
-8
lines changed

6 files changed

+15
-8
lines changed

@types/express/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ declare namespace Express {
1313
view_count: number;
1414
created_at: string;
1515
};
16+
csrfToken?: string;
1617
}
1718
}
1819

src/middleware/auth/CsrfTokenIssueMiddleware.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import CsrfTokenConstants from "../../constants/CsrfTokenConstants.json";
55

66
export default class CsrfTokenIssueMiddleware extends BaseMiddleware {
77
protected async executeImpl(
8-
_req: Request,
8+
req: Request,
99
res: Response,
1010
next: NextFunction
1111
): Promise<void> {
@@ -17,6 +17,7 @@ export default class CsrfTokenIssueMiddleware extends BaseMiddleware {
1717
httpOnly: true,
1818
maxAge: 15 * 60 * 1000,
1919
});
20+
req.csrfToken = csrfToken;
2021
this.next(next);
2122
} catch (e) {
2223
this.uncaughtError(res, e);

src/middleware/auth/CsrfTokenVerifyMiddleware.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ test("test verify", () => {
1717
query: {
1818
state: state1,
1919
},
20-
cookies: {
20+
signedCookies: {
2121
[CsrfTokenConstants.cookieName]: state1,
2222
},
2323
} as unknown) as Request;
@@ -36,7 +36,7 @@ test("test mismatch", () => {
3636
query: {
3737
state: state1,
3838
},
39-
cookies: {
39+
signedCookies: {
4040
[CsrfTokenConstants.cookieName]: state2,
4141
},
4242
} as unknown) as Request;
@@ -57,7 +57,7 @@ describe("test missing", () => {
5757
const failSpy = jest.spyOn(csrfTokenVerifyMiddleware, "fail");
5858
const req = ({
5959
query: {},
60-
cookies: {
60+
signedCookies: {
6161
[CsrfTokenConstants.cookieName]: state1,
6262
},
6363
} as unknown) as Request;
@@ -78,7 +78,7 @@ describe("test missing", () => {
7878
query: {
7979
state: state1,
8080
},
81-
cookies: {},
81+
signedCookies: {},
8282
} as unknown) as Request;
8383
const res: any = {};
8484
res.status = jest.fn().mockReturnValue(res);
@@ -95,7 +95,7 @@ describe("test missing", () => {
9595
const failSpy = jest.spyOn(csrfTokenVerifyMiddleware, "fail");
9696
const req = ({
9797
query: {},
98-
cookies: {},
98+
signedCookies: {},
9999
} as unknown) as Request;
100100
const res: any = {};
101101
res.status = jest.fn().mockReturnValue(res);

src/middleware/auth/CsrfTokenVerifyMiddleware.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ export default class CsrfTokenVerifyMiddleware extends BaseMiddleware {
1212
): Promise<void> {
1313
try {
1414
const { state } = req.query;
15-
const csrfState = req.cookies[CsrfTokenConstants.cookieName];
15+
const csrfState = req.signedCookies[CsrfTokenConstants.cookieName];
16+
console.log(req.signedCookies);
1617
if (
1718
state !== csrfState ||
1819
state === undefined ||

src/routes/initialize/InitializeAuthDirectController.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ export default class InitialzeAuthDirectController extends BaseController {
1717
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1818
params.set("client_id", TWITCH_CLIENT_ID!);
1919
params.set("force_verify", "true");
20+
if (req.csrfToken) {
21+
params.set("state", req.csrfToken);
22+
}
2023

2124
res.redirect(`${TwitchConstants.authorize}?${params.toString()}`);
2225
} catch (e) {

tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,6 @@
6868
"skipLibCheck": true /* Skip type checking of declaration files. */,
6969
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */,
7070
"resolveJsonModule": true
71-
}
71+
},
72+
"exclude": ["*.test.ts"]
7273
}

0 commit comments

Comments
 (0)