Skip to content

Commit

Permalink
feat(clerk-js,nextjs): Introduce multipleAppsSameDomain Clerk option …
Browse files Browse the repository at this point in the history
…to support cookie suffixing
  • Loading branch information
dimkl committed Apr 12, 2024
1 parent fcadc28 commit 2bf01fe
Show file tree
Hide file tree
Showing 6 changed files with 16 additions and 21 deletions.
26 changes: 7 additions & 19 deletions packages/clerk-js/src/core/auth/SessionCookieService.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { setDevBrowserJWTInURL } from '@clerk/shared/devBrowser';
import { is4xxError, isClerkAPIResponseError, isNetworkError } from '@clerk/shared/error';
import type { Clerk, EnvironmentResource, TokenResource } from '@clerk/types';
import type { Clerk, EnvironmentResource } from '@clerk/types';

import { inBrowser } from '../../utils';
import { clerkCoreErrorTokenRefreshFailed, clerkMissingDevBrowserJwt } from '../errors';
import { eventBus, events } from '../events';
import type { FapiClient } from '../fapiClient';
Expand All @@ -14,6 +13,8 @@ import type { DevBrowser } from './devBrowser';
import { createDevBrowser } from './devBrowser';
import { SessionCookiePoller } from './SessionCookiePoller';

// TODO: make SessionCookieService singleton since it handles updating cookies using a poller
// and we need to avoid updating them concurrently.
export class SessionCookieService {
private environment: EnvironmentResource | undefined;
private poller: SessionCookiePoller | null = null;
Expand All @@ -24,7 +25,7 @@ export class SessionCookieService {
constructor(private clerk: Clerk, fapiClient: FapiClient, multipleAppsSameDomainEnabled = false) {
// set cookie on token update
eventBus.on(events.TokenUpdate, ({ token }) => {
this.updateSessionCookie(token?.getRawString());
this.updateSessionCookie(token && token.getRawString());
this.setClientUatCookieForDevelopmentInstances();
});

Expand Down Expand Up @@ -90,10 +91,6 @@ export class SessionCookieService {
}

private refreshTokenOnVisibilityChange() {
if (!inBrowser()) {
return;
}

document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
void this.refreshSessionToken();
Expand All @@ -102,28 +99,19 @@ export class SessionCookieService {
}

private async refreshSessionToken(): Promise<void> {
if (!inBrowser()) {
return;
}

if (!this.clerk.session) {
return;
}

try {
this.updateSessionCookie(await this.clerk.session?.getToken());
await this.clerk.session.getToken();
} catch (e) {
return this.handleGetTokenError(e);
}
}

private updateSessionCookie(token: TokenResource | string | undefined | null) {
const rawToken = typeof token === 'string' ? token : token?.getRawString();

if (rawToken) {
return this.sessionCookie.set(rawToken);
}
return this.sessionCookie.remove();
private updateSessionCookie(token: string | null) {
return token ? this.sessionCookie.set(token) : this.sessionCookie.remove();
}

private setClientUatCookieForDevelopmentInstances() {
Expand Down
1 change: 1 addition & 0 deletions packages/clerk-js/src/core/auth/devBrowser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export function createDevBrowser(
if (devBrowserJWT && request?.url) {
request.url = setDevBrowserJWTInURL(request.url, devBrowserJWT);
}
request.url?.searchParams.append('_multiple_apps_same_domain', withSuffix.toString());
});

fapiClient.onAfterResponse((_, response) => {
Expand Down
2 changes: 1 addition & 1 deletion packages/clerk-js/src/core/clerk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1394,7 +1394,7 @@ export class Clerk implements ClerkInterface {
};

#loadInStandardBrowser = async (): Promise<boolean> => {
this.#authService = new SessionCookieService(this, this.#fapiClient);
this.#authService = new SessionCookieService(this, this.#fapiClient, this.#options.multipleAppsSameDomain);

/**
* 1. Create the devBrowser.
Expand Down
6 changes: 5 additions & 1 deletion packages/nextjs/src/pages/ClerkProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,11 @@ export function ClerkProvider({ children, ...props }: NextClerkProviderProps): J

const navigate = (to: string) => push(to);
const replaceNavigate = (to: string) => replace(to);
const mergedProps = mergeNextClerkPropsWithEnv({ ...props, routerPush: navigate, routerReplace: replaceNavigate });
const mergedProps = mergeNextClerkPropsWithEnv({
...props,
routerPush: navigate,
routerReplace: replaceNavigate,
});
// ClerkProvider automatically injects __clerk_ssr_state
// getAuth returns a user-facing authServerSideProps that hides __clerk_ssr_state
// @ts-expect-error initialState is hidden from the types as it's a private prop
Expand Down
1 change: 1 addition & 0 deletions packages/nextjs/src/utils/mergeNextClerkPropsWithEnv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@ export const mergeNextClerkPropsWithEnv = (props: Omit<NextClerkProviderProps, '
debug: isTruthy(process.env.NEXT_PUBLIC_CLERK_TELEMETRY_DEBUG),
},
sdkMetadata: SDK_METADATA,
multipleAppsSameDomain: true,
};
};
1 change: 1 addition & 0 deletions packages/types/src/clerk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,7 @@ export type ClerkOptions = ClerkOptionsNavigation &
};

sdkMetadata?: SDKMetadata;
multipleAppsSameDomain?: boolean;
};

export interface NavigateOptions {
Expand Down

0 comments on commit 2bf01fe

Please sign in to comment.