fix: get session cookie helper should use better url retrieval and read config overrides (#1828)

* fix: url retreiving should use getBaseURL

* fix: session cookie getter issue with custom config

* chore: remove log
This commit is contained in:
Bereket Engida
2025-03-15 22:31:52 +03:00
committed by GitHub
parent b295cdd7e5
commit 0b82136ede
2 changed files with 109 additions and 10 deletions
@@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
import { getTestInstance } from "../test-utils/test-instance";
import { getCookies } from "../cookies";
import { getCookies, getSessionCookie } from "../cookies";
import type { BetterAuthOptions } from "../types/options";
describe("cookies", async () => {
@@ -151,3 +151,94 @@ describe("cookie configuration", () => {
expect(cookies.sessionData.options.domain).toBe("example.com");
});
});
describe("getSessionCookie", async () => {
it("should return the correct session cookie", async () => {
const { client, testUser, signInWithTestUser } = await getTestInstance();
const { headers } = await signInWithTestUser();
const request = new Request("http://localhost:3000/api/auth/session", {
headers,
});
const cookies = getSessionCookie(request);
expect(cookies).not.toBeNull();
expect(cookies).toBeDefined();
});
it("should return the correct session cookie on production", async () => {
const { client, testUser, cookieSetter } = await getTestInstance({
baseURL: "https://example.com",
});
const headers = new Headers();
await client.signIn.email(
{
email: testUser.email,
password: testUser.password,
},
{
onSuccess: cookieSetter(headers),
},
);
const request = new Request("https://example.com/api/auth/session", {
headers,
});
const cookies = getSessionCookie(request);
expect(cookies).not.toBeNull();
expect(cookies).toBeDefined();
});
it("should allow override cookie prefix", async () => {
const { client, testUser, cookieSetter } = await getTestInstance({
advanced: {
useSecureCookies: true,
cookiePrefix: "test-prefix",
},
});
const headers = new Headers();
await client.signIn.email(
{
email: testUser.email,
password: testUser.password,
},
{ onSuccess: cookieSetter(headers) },
);
const request = new Request("https://example.com/api/auth/session", {
headers,
});
const cookies = getSessionCookie(request, {
cookiePrefix: "test-prefix",
});
expect(cookies).not.toBeNull();
});
it("should allow override cookie name", async () => {
const { client, testUser, cookieSetter } = await getTestInstance({
advanced: {
useSecureCookies: true,
cookiePrefix: "test",
cookies: {
session_token: {
name: "test-session-token",
},
},
},
});
const headers = new Headers();
await client.signIn.email(
{
email: testUser.email,
password: testUser.password,
},
{
onSuccess: cookieSetter(headers),
},
);
const request = new Request("https://example.com/api/auth/session", {
headers,
});
const cookies = getSessionCookie(request, {
cookieName: "session-token",
cookiePrefix: "test",
});
expect(cookies).not.toBeNull();
});
});
+17 -9
View File
@@ -9,6 +9,7 @@ import { base64Url } from "@better-auth/utils/base64";
import { createTime } from "../utils/time";
import { createHMAC } from "@better-auth/utils/hmac";
import { safeJSONParse } from "../utils/json";
import { getBaseURL } from "../utils/url";
export function createCookieGetter(options: BetterAuthOptions) {
const secure =
@@ -239,26 +240,33 @@ export const getSessionCookie = (
cookiePrefix?: string;
cookieName?: string;
useSecureCookies?: boolean;
path?: string;
},
) => {
if (config?.cookiePrefix) {
if (config.cookieName) {
config.cookiePrefix = `${config.cookiePrefix}-`;
} else {
config.cookiePrefix = `${config.cookiePrefix}.`;
}
}
const headers = request instanceof Headers ? request : request.headers;
const req = request instanceof Request ? request : undefined;
const url = getBaseURL(req?.url, config?.path, req);
const cookies = headers.get("cookie");
if (!cookies) {
return null;
}
const {
cookieName = "session_token",
cookiePrefix = "better-auth",
useSecureCookies = (request instanceof Request &&
isProduction &&
request.url.startsWith("https://")) ||
(request instanceof Request && request.url.startsWith("https://")
? true
: false),
cookiePrefix = "better-auth.",
useSecureCookies = isProduction || url?.startsWith("https://")
? true
: false,
} = config || {};
const name = useSecureCookies
? `__Secure-${cookiePrefix}.${cookieName}`
: `${cookiePrefix}.${cookieName}`;
? `__Secure-${cookiePrefix}${cookieName}`
: `${cookiePrefix}${cookieName}`;
const parsedCookie = parseCookies(cookies);
const sessionToken = parsedCookie.get(name);
if (sessionToken) {