Skip to content

Commit 94ccdfe

Browse files
committed
Prefix secure cookies with __Host-
When using secure cookeis we also set the `__Host-` prefix
1 parent 041e400 commit 94ccdfe

File tree

2 files changed

+30
-14
lines changed

2 files changed

+30
-14
lines changed

src/tokensource/cookies.test.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@ import httpMocks from "node-mocks-http";
22
import { describe, it, expect } from "vitest";
33
import { CookieTokenSource } from "./cookies";
44

5-
65
describe("CookieTokenSource", () => {
76
it("should get the access token from cookies", () => {
87
const request = httpMocks.createRequest();
98
request.cookies = { authToken: "FOOBAR" };
109

1110
const cookieTokenSource = new CookieTokenSource({
12-
secure: true,
11+
secure: false,
1312
sameSite: "strict",
1413
refreshTokenPath: "/refresh",
1514
});
@@ -18,9 +17,9 @@ describe("CookieTokenSource", () => {
1817
});
1918

2019
it("should get the refresh token from cookies", () => {
21-
const request = httpMocks.createRequest();
22-
request.cookies = { authRefreshToken: "FOOBAR" };
23-
20+
const request = httpMocks.createRequest({
21+
cookies: { "__Host-authRefreshToken": "FOOBAR" },
22+
});
2423
const cookieTokenSource = new CookieTokenSource({
2524
secure: true,
2625
sameSite: "strict",

src/tokensource/cookies.ts

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,43 @@ export class CookieTokenSource implements TokenSource {
2121

2222
cookieNames = {
2323
accessToken: "authToken",
24-
accessTokenFingerprint: "authTokenHash",
24+
accessTokenHash: "authTokenHash",
2525
refreshToken: "authRefreshToken",
2626
refreshTokenExist: "authRefreshTokenExist",
2727
};
2828

29+
_getCookieName(name: string): string {
30+
if (this.options.secure) return `__Host-${name}`;
31+
return `${name}`;
32+
}
33+
34+
_getCookie(request: Request, name: string) {
35+
return request.cookies[this._getCookieName(name)];
36+
}
37+
38+
_setCookie(
39+
response: Response,
40+
name: string,
41+
value: string,
42+
options: CookieOptions
43+
) {
44+
response.cookie(this._getCookieName(name), value, options);
45+
}
46+
2947
getAccessToken(request: Request): string {
30-
return request.cookies[this.cookieNames.accessToken];
48+
return this._getCookie(request, this.cookieNames.accessToken);
3149
}
3250

3351
getRefreshToken(request: Request): string {
34-
return request.cookies[this.cookieNames.refreshToken];
52+
return this._getCookie(request, this.cookieNames.refreshToken);
3553
}
3654

3755
getFingerprint(request: Request): string {
38-
return request.cookies[this.cookieNames.accessTokenFingerprint];
56+
return this._getCookie(request, this.cookieNames.accessTokenHash);
3957
}
4058

4159
setAccessToken(response: Response, token: string) {
42-
response.cookie(this.cookieNames.accessToken, token, {
60+
this._setCookie(response, this.cookieNames.accessToken, token, {
4361
httpOnly: false,
4462
secure: this.options.secure,
4563
sameSite: this.options.sameSite,
@@ -48,15 +66,15 @@ export class CookieTokenSource implements TokenSource {
4866

4967
setRefreshToken(response: Response, token: string) {
5068
const expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 365);
51-
response.cookie(this.cookieNames.refreshToken, token, {
69+
this._setCookie(response, this.cookieNames.refreshToken, token, {
5270
httpOnly: true,
5371
path: this.options.refreshTokenPath,
5472
secure: this.options.secure,
5573
sameSite: this.options.sameSite,
5674
expires: expiresAt,
5775
});
5876

59-
response.cookie(this.cookieNames.refreshTokenExist, "1", {
77+
this._setCookie(response, this.cookieNames.refreshTokenExist, "1", {
6078
httpOnly: false,
6179
secure: this.options.secure,
6280
sameSite: this.options.sameSite,
@@ -65,8 +83,7 @@ export class CookieTokenSource implements TokenSource {
6583
}
6684

6785
setFingerprint(response: Response, fingerprint: string) {
68-
response.cookie(this.cookieNames.accessTokenFingerprint, fingerprint, {
69-
path: "/graphql",
86+
this._setCookie(response, this.cookieNames.accessTokenHash, fingerprint, {
7087
httpOnly: true,
7188
secure: this.options.secure,
7289
sameSite: this.options.sameSite,

0 commit comments

Comments
 (0)