From dd6dc9d2c8036c2891cdea3a52b77a7a73b8036f Mon Sep 17 00:00:00 2001 From: Namit Nathwani Date: Wed, 11 Jun 2025 17:23:45 +0530 Subject: [PATCH 1/3] test: setting session cookies - Adds support for token transfer method - Adds route for `createNewSession` --- test/test-server/package-lock.json | 126 +++++++++++++++++++++++++++++ test/test-server/package.json | 1 + test/test-server/src/index.ts | 13 ++- test/test-server/src/session.ts | 44 ++++++++++ 4 files changed, 183 insertions(+), 1 deletion(-) diff --git a/test/test-server/package-lock.json b/test/test-server/package-lock.json index 5dbb280c2b..dc83f1e66d 100644 --- a/test/test-server/package-lock.json +++ b/test/test-server/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "debug": "^4.3.5", "express": "^4.19.2", + "morgan": "^1.10.0", "nock": "^13.5.4", "typescript": "^5.4.5" }, @@ -434,6 +435,24 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -988,6 +1007,49 @@ "node": ">= 0.6" } }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "license": "MIT", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1036,6 +1098,15 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1543,6 +1614,21 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -1952,6 +2038,41 @@ "mime-db": "1.52.0" } }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "requires": { + "ee-first": "1.1.1" + } + } + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1985,6 +2106,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", diff --git a/test/test-server/package.json b/test/test-server/package.json index 4bf3e6d9d5..5557e09830 100644 --- a/test/test-server/package.json +++ b/test/test-server/package.json @@ -10,6 +10,7 @@ "dependencies": { "debug": "^4.3.5", "express": "^4.19.2", + "morgan": "^1.10.0", "nock": "^13.5.4", "typescript": "^5.4.5" }, diff --git a/test/test-server/src/index.ts b/test/test-server/src/index.ts index a18b0737f8..e3de18e7d8 100644 --- a/test/test-server/src/index.ts +++ b/test/test-server/src/index.ts @@ -59,7 +59,7 @@ import { resetOverrideLogs, logOverrideEvent, getOverrideLogs } from "./override import Dashboard from "../../../recipe/dashboard"; import DashboardRecipe from "../../../lib/build/recipe/dashboard/recipe"; import { TypeInput as WebauthnTypeInput } from "../../../lib/build/recipe/webauthn/types"; - +import morgan from "morgan"; const { logDebugMessage } = logger("com.supertokens:node-test-server"); const API_PORT = Number(process.env.API_PORT || 3030); @@ -163,6 +163,7 @@ function initST(config: any) { "Session.getCookieNameForTokenType", getCookieNameForTokenType ), + getTokenTransferMethod: () => config.getTokenTransferMethod ?? "any", override: { apis: overrideBuilderWithLogging("Session.override.apis", config?.override?.apis), functions: overrideBuilderWithLogging( @@ -387,6 +388,14 @@ function initST(config: any) { supertokens.init(init); } +morgan.token("body", function (req, res) { + return JSON.stringify(req.body); +}); + +morgan.token("res-body", function (req, res) { + return typeof res.__custombody__ ? res.__custombody__ : JSON.stringify(res.__custombody__); +}); + const app = express(); app.use(express.json()); app.use((req, res, next) => { @@ -394,6 +403,8 @@ app.use((req, res, next) => { next(); }); app.use(middleware()); +app.use(morgan("[:date[iso]] :url :method :body", { immediate: true })); +app.use(morgan("[:date[iso]] :url :method :status :response-time ms - :res[content-length] :res-body")); app.get("/test/ping", async (req, res, next) => { res.json({ ok: true }); diff --git a/test/test-server/src/session.ts b/test/test-server/src/session.ts index 49c2eab59a..a7b904b8ba 100644 --- a/test/test-server/src/session.ts +++ b/test/test-server/src/session.ts @@ -39,6 +39,50 @@ const router = Router() next(e); } }) + .post("/createnewsession", async (req, res, next) => { + const fdiVersion = req.headers["fdi-version"] as string; + + try { + logDebugMessage("Session.createNewSessionWithoutRequestResponse %j", req.body); + let recipeUserId; + if ( + maxVersion("1.17", fdiVersion) === "1.17" || + (maxVersion("2.0", fdiVersion) === fdiVersion && maxVersion("3.0", fdiVersion) !== fdiVersion) + ) { + // fdiVersion <= "1.17" || (fdiVersion >= "2.0" && fdiVersion < "3.0") + recipeUserId = supertokens.convertToRecipeUserId(req.body.userId); + } else { + recipeUserId = supertokens.convertToRecipeUserId(req.body.recipeUserId); + } + const response = await Session.createNewSession( + req, + res, + req.body.tenantId || "public", + recipeUserId, + req.body.accessTokenPayload, + req.body.sessionDataInDatabase, + req.body.userContext + ); + + res.json({ + sessionHandle: response.getHandle(), + userId: response.getUserId(), + tenantId: response.getTenantId(), + userDataInAccessToken: response.getAccessTokenPayload(), + accessToken: response.getAccessToken(), + frontToken: response.getAllSessionTokensDangerously()["frontToken"], + refreshToken: response.getAllSessionTokensDangerously()["refreshToken"], + antiCsrfToken: response.getAllSessionTokensDangerously()["antiCsrfToken"], + accessTokenUpdated: response.getAllSessionTokensDangerously()["accessAndFrontTokenUpdated"], + recipeUserId: { + recipeUserId: response.getRecipeUserId().getAsString(), + }, + }); + } catch (e) { + console.log(e); + next(e); + } + }) .post("/getsessionwithoutrequestresponse", async (req, res, next) => { try { logDebugMessage("Session.getSessionWithoutRequestResponse %j", req.body); From 65e935ab2ef2444430d2b90f076a4747246e99be Mon Sep 17 00:00:00 2001 From: Namit Nathwani Date: Thu, 3 Jul 2025 15:15:37 +0530 Subject: [PATCH 2/3] update: remove new endpoint --- test/auth-react-server/index.js | 2 +- test/test-server/src/session.ts | 44 --------------------------------- 2 files changed, 1 insertion(+), 45 deletions(-) diff --git a/test/auth-react-server/index.js b/test/auth-react-server/index.js index 740480277d..4cdb2504a0 100644 --- a/test/auth-react-server/index.js +++ b/test/auth-react-server/index.js @@ -685,7 +685,7 @@ morgan.token("body", function (req, res) { }); morgan.token("res-body", function (req, res) { - return typeof res.__custombody__ ? res.__custombody__ : JSON.stringify(res.__custombody__); + return typeof res.__custombody__ === "string" ? res.__custombody__ : JSON.stringify(res.__custombody__); }); app.use(urlencodedParser); diff --git a/test/test-server/src/session.ts b/test/test-server/src/session.ts index a7b904b8ba..49c2eab59a 100644 --- a/test/test-server/src/session.ts +++ b/test/test-server/src/session.ts @@ -39,50 +39,6 @@ const router = Router() next(e); } }) - .post("/createnewsession", async (req, res, next) => { - const fdiVersion = req.headers["fdi-version"] as string; - - try { - logDebugMessage("Session.createNewSessionWithoutRequestResponse %j", req.body); - let recipeUserId; - if ( - maxVersion("1.17", fdiVersion) === "1.17" || - (maxVersion("2.0", fdiVersion) === fdiVersion && maxVersion("3.0", fdiVersion) !== fdiVersion) - ) { - // fdiVersion <= "1.17" || (fdiVersion >= "2.0" && fdiVersion < "3.0") - recipeUserId = supertokens.convertToRecipeUserId(req.body.userId); - } else { - recipeUserId = supertokens.convertToRecipeUserId(req.body.recipeUserId); - } - const response = await Session.createNewSession( - req, - res, - req.body.tenantId || "public", - recipeUserId, - req.body.accessTokenPayload, - req.body.sessionDataInDatabase, - req.body.userContext - ); - - res.json({ - sessionHandle: response.getHandle(), - userId: response.getUserId(), - tenantId: response.getTenantId(), - userDataInAccessToken: response.getAccessTokenPayload(), - accessToken: response.getAccessToken(), - frontToken: response.getAllSessionTokensDangerously()["frontToken"], - refreshToken: response.getAllSessionTokensDangerously()["refreshToken"], - antiCsrfToken: response.getAllSessionTokensDangerously()["antiCsrfToken"], - accessTokenUpdated: response.getAllSessionTokensDangerously()["accessAndFrontTokenUpdated"], - recipeUserId: { - recipeUserId: response.getRecipeUserId().getAsString(), - }, - }); - } catch (e) { - console.log(e); - next(e); - } - }) .post("/getsessionwithoutrequestresponse", async (req, res, next) => { try { logDebugMessage("Session.getSessionWithoutRequestResponse %j", req.body); From 80fb31016ba242feebcf8f8f68cbab177fe5324a Mon Sep 17 00:00:00 2001 From: Namit Nathwani Date: Thu, 3 Jul 2025 15:32:19 +0530 Subject: [PATCH 3/3] fix: morgan res-body check --- test/test-server/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test-server/src/index.ts b/test/test-server/src/index.ts index e3de18e7d8..9da51672a2 100644 --- a/test/test-server/src/index.ts +++ b/test/test-server/src/index.ts @@ -393,7 +393,7 @@ morgan.token("body", function (req, res) { }); morgan.token("res-body", function (req, res) { - return typeof res.__custombody__ ? res.__custombody__ : JSON.stringify(res.__custombody__); + return typeof res.__custombody__ === "string" ? res.__custombody__ : JSON.stringify(res.__custombody__); }); const app = express();