diff --git a/backend/src/server/lib/cookie.ts b/backend/src/server/lib/cookie.ts new file mode 100644 index 000000000..cc6956056 --- /dev/null +++ b/backend/src/server/lib/cookie.ts @@ -0,0 +1,38 @@ +import { FastifyReply } from "fastify"; + +import { getConfig } from "@app/lib/config/env"; +import { logger } from "@app/lib/logger"; + +export function addAuthOriginDomainCookie(res: FastifyReply) { + try { + const appCfg = getConfig(); + + // Only set the cookie if the app is running in cloud mode + if (!appCfg.isCloud) return; + + const siteUrl = appCfg.SITE_URL!; + let domain: string; + + const { hostname } = new URL(siteUrl); + + const parts = hostname.split("."); + + if (parts.length >= 2) { + // For `app.infisical.com` => `.infisical.com` + domain = `.${parts.slice(-2).join(".")}`; + } else { + // If somehow only "example", fallback to itself + domain = `.${hostname}`; + } + + void res.setCookie("aod", siteUrl, { + domain, + path: "/", + sameSite: "strict", + httpOnly: false, + secure: appCfg.HTTPS_ENABLED + }); + } catch (error) { + logger.error(error, "Failed to set auth origin domain cookie"); + } +} diff --git a/backend/src/server/routes/v1/admin-router.ts b/backend/src/server/routes/v1/admin-router.ts index 2e31077a7..6cc50dc5c 100644 --- a/backend/src/server/routes/v1/admin-router.ts +++ b/backend/src/server/routes/v1/admin-router.ts @@ -12,6 +12,7 @@ import { getConfig, overridableKeys } from "@app/lib/config/env"; import { crypto } from "@app/lib/crypto/cryptography"; import { BadRequestError } from "@app/lib/errors"; import { invalidateCacheLimit, readLimit, writeLimit } from "@app/server/config/rateLimiter"; +import { addAuthOriginDomainCookie } from "@app/server/lib/cookie"; import { getTelemetryDistinctId } from "@app/server/lib/telemetry"; import { verifySuperAdmin } from "@app/server/plugins/auth/superAdmin"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; @@ -593,6 +594,8 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { secure: appCfg.HTTPS_ENABLED }); + addAuthOriginDomainCookie(res); + return { message: "Successfully set up admin account", user: user.user, diff --git a/backend/src/server/routes/v1/sso-router.ts b/backend/src/server/routes/v1/sso-router.ts index 5e2518362..0aec39f3e 100644 --- a/backend/src/server/routes/v1/sso-router.ts +++ b/backend/src/server/routes/v1/sso-router.ts @@ -22,6 +22,7 @@ import { logger } from "@app/lib/logger"; import { ms } from "@app/lib/ms"; import { fetchGithubEmails, fetchGithubUser } from "@app/lib/requests/github"; import { authRateLimit } from "@app/server/config/rateLimiter"; +import { addAuthOriginDomainCookie } from "@app/server/lib/cookie"; import { AuthMethod } from "@app/services/auth/auth-type"; import { OrgAuthMethod } from "@app/services/org/org-types"; import { getServerCfg } from "@app/services/super-admin/super-admin-service"; @@ -475,6 +476,8 @@ export const registerSsoRouter = async (server: FastifyZodProvider) => { secure: appCfg.HTTPS_ENABLED }); + addAuthOriginDomainCookie(res); + return { encryptionVersion: data.user.encryptionVersion, token: data.token.access, diff --git a/backend/src/server/routes/v2/mfa-router.ts b/backend/src/server/routes/v2/mfa-router.ts index bdb609432..59a3943f7 100644 --- a/backend/src/server/routes/v2/mfa-router.ts +++ b/backend/src/server/routes/v2/mfa-router.ts @@ -4,6 +4,7 @@ import { getConfig } from "@app/lib/config/env"; import { crypto } from "@app/lib/crypto"; import { BadRequestError, NotFoundError } from "@app/lib/errors"; import { mfaRateLimit } from "@app/server/config/rateLimiter"; +import { addAuthOriginDomainCookie } from "@app/server/lib/cookie"; import { AuthModeMfaJwtTokenPayload, AuthTokenType, MfaMethod } from "@app/services/auth/auth-type"; export const registerMfaRouter = async (server: FastifyZodProvider) => { @@ -131,6 +132,8 @@ export const registerMfaRouter = async (server: FastifyZodProvider) => { secure: appCfg.HTTPS_ENABLED }); + addAuthOriginDomainCookie(res); + return { ...user, token: token.access, diff --git a/backend/src/server/routes/v2/organization-router.ts b/backend/src/server/routes/v2/organization-router.ts index fd60316db..c17200a30 100644 --- a/backend/src/server/routes/v2/organization-router.ts +++ b/backend/src/server/routes/v2/organization-router.ts @@ -10,6 +10,7 @@ import { import { ApiDocsTags, ORGANIZATIONS } from "@app/lib/api-docs"; import { getConfig } from "@app/lib/config/env"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; +import { addAuthOriginDomainCookie } from "@app/server/lib/cookie"; import { GenericResourceNameSchema } from "@app/server/lib/schemas"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { ActorType, AuthMode } from "@app/services/auth/auth-type"; @@ -396,6 +397,8 @@ export const registerOrgRouter = async (server: FastifyZodProvider) => { secure: cfg.HTTPS_ENABLED }); + addAuthOriginDomainCookie(res); + return { organization, accessToken: tokens.accessToken }; } }); diff --git a/backend/src/server/routes/v3/login-router.ts b/backend/src/server/routes/v3/login-router.ts index 91df68e16..3a8510f34 100644 --- a/backend/src/server/routes/v3/login-router.ts +++ b/backend/src/server/routes/v3/login-router.ts @@ -3,6 +3,7 @@ import { z } from "zod"; import { INFISICAL_PROVIDER_GITHUB_ACCESS_TOKEN } from "@app/lib/config/const"; import { getConfig } from "@app/lib/config/env"; import { authRateLimit } from "@app/server/config/rateLimiter"; +import { addAuthOriginDomainCookie } from "@app/server/lib/cookie"; export const registerLoginRouter = async (server: FastifyZodProvider) => { server.route({ @@ -93,6 +94,8 @@ export const registerLoginRouter = async (server: FastifyZodProvider) => { secure: cfg.HTTPS_ENABLED }); + addAuthOriginDomainCookie(res); + void res.cookie("infisical-project-assume-privileges", "", { httpOnly: true, path: "/", @@ -155,6 +158,8 @@ export const registerLoginRouter = async (server: FastifyZodProvider) => { secure: appCfg.HTTPS_ENABLED }); + addAuthOriginDomainCookie(res); + void res.cookie("infisical-project-assume-privileges", "", { httpOnly: true, path: "/", diff --git a/backend/src/server/routes/v3/signup-router.ts b/backend/src/server/routes/v3/signup-router.ts index 393b598cf..391c459a2 100644 --- a/backend/src/server/routes/v3/signup-router.ts +++ b/backend/src/server/routes/v3/signup-router.ts @@ -4,6 +4,7 @@ import { UsersSchema } from "@app/db/schemas"; import { getConfig } from "@app/lib/config/env"; import { ForbiddenRequestError } from "@app/lib/errors"; import { authRateLimit, smtpRateLimit } from "@app/server/config/rateLimiter"; +import { addAuthOriginDomainCookie } from "@app/server/lib/cookie"; import { GenericResourceNameSchema } from "@app/server/lib/schemas"; import { getServerCfg } from "@app/services/super-admin/super-admin-service"; import { PostHogEventTypes } from "@app/services/telemetry/telemetry-types"; @@ -170,6 +171,8 @@ export const registerSignupRouter = async (server: FastifyZodProvider) => { secure: appCfg.HTTPS_ENABLED }); + addAuthOriginDomainCookie(res); + return { message: "Successfully set up account", user, token: accessToken, organizationId }; } }); @@ -239,6 +242,8 @@ export const registerSignupRouter = async (server: FastifyZodProvider) => { }); // TODO(akhilmhdh-pg): add telemetry service + addAuthOriginDomainCookie(res); + return { message: "Successfully set up account", user, token: accessToken }; } }); diff --git a/nginx/default.dev.conf b/nginx/default.dev.conf index 2dd32049b..f1de1790c 100644 --- a/nginx/default.dev.conf +++ b/nginx/default.dev.conf @@ -14,7 +14,7 @@ server { proxy_pass http://backend:4000; proxy_redirect off; - proxy_cookie_path / "/; HttpOnly; SameSite=strict"; + proxy_cookie_path / "/; SameSite=strict"; } location /runtime-ui-env.js {