Skip to content

Commit 6af51c8

Browse files
authored
feat(remix): Support new redirect urls as environment variables or options to rootAuthLoader (#3442)
1 parent 46a0a7b commit 6af51c8

File tree

7 files changed

+74
-10
lines changed

7 files changed

+74
-10
lines changed

.changeset/eighty-rabbits-yawn.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
'@clerk/remix': minor
3+
---
4+
5+
Support new redirect urls as environment variables or options to rootAuthLoader
6+
7+
As options
8+
- signInForceRedirectUrl
9+
- signUpForceRedirectUrl
10+
- signInFallbackRedirectUrl
11+
- signUpFallbackRedirectUrl
12+
13+
As environment variables
14+
- CLERK_SIGN_IN_FORCE_REDIRECT_URL
15+
- CLERK_SIGN_UP_FORCE_REDIRECT_URL
16+
- CLERK_SIGN_IN_FALLBACK_REDIRECT_URL
17+
- CLERK_SIGN_UP_FALLBACK_REDIRECT_URL

packages/remix/src/client/RemixClerkProvider.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ export function ClerkProvider({ children, ...rest }: ClerkProviderPropsWithState
5757
__signUpUrl,
5858
__afterSignInUrl,
5959
__afterSignUpUrl,
60+
__signInForceRedirectUrl,
61+
__signUpForceRedirectUrl,
62+
__signInFallbackRedirectUrl,
63+
__signUpFallbackRedirectUrl,
6064
__clerkJSUrl,
6165
__clerkJSVersion,
6266
__telemetryDisabled,
@@ -80,6 +84,10 @@ export function ClerkProvider({ children, ...rest }: ClerkProviderPropsWithState
8084
signUpUrl: __signUpUrl,
8185
afterSignInUrl: __afterSignInUrl,
8286
afterSignUpUrl: __afterSignUpUrl,
87+
signInForceRedirectUrl: __signInForceRedirectUrl,
88+
signUpForceRedirectUrl: __signUpForceRedirectUrl,
89+
signInFallbackRedirectUrl: __signInFallbackRedirectUrl,
90+
signUpFallbackRedirectUrl: __signUpFallbackRedirectUrl,
8391
clerkJSUrl: __clerkJSUrl,
8492
clerkJSVersion: __clerkJSVersion,
8593
telemetry: {

packages/remix/src/client/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ export type ClerkState = {
1414
__signUpUrl: string | undefined;
1515
__afterSignInUrl: string | undefined;
1616
__afterSignUpUrl: string | undefined;
17+
__signInForceRedirectUrl: string | undefined;
18+
__signUpForceRedirectUrl: string | undefined;
19+
__signInFallbackRedirectUrl: string | undefined;
20+
__signUpFallbackRedirectUrl: string | undefined;
1721
__clerk_debug: any;
1822
__clerkJSUrl: string | undefined;
1923
__clerkJSVersion: string | undefined;

packages/remix/src/ssr/loadOptions.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ export const loadOptions = (args: LoaderFunctionArgs, overrides: RootAuthLoaderO
3434
);
3535
const signInUrl = overrides.signInUrl || getEnvVariable('CLERK_SIGN_IN_URL', context) || '';
3636
const signUpUrl = overrides.signUpUrl || getEnvVariable('CLERK_SIGN_UP_URL', context) || '';
37+
const signInForceRedirectUrl =
38+
overrides.signInForceRedirectUrl || getEnvVariable('CLERK_SIGN_IN_FORCE_REDIRECT_URL', context) || '';
39+
const signUpForceRedirectUrl =
40+
overrides.signUpForceRedirectUrl || getEnvVariable('CLERK_SIGN_UP_FORCE_REDIRECT_URL', context) || '';
41+
const signInFallbackRedirectUrl =
42+
overrides.signInFallbackRedirectUrl || getEnvVariable('CLERK_SIGN_IN_FALLBACK_REDIRECT_URL', context) || '';
43+
const signUpFallbackRedirectUrl =
44+
overrides.signUpFallbackRedirectUrl || getEnvVariable('CLERK_SIGN_UP_FALLBACK_REDIRECT_URL', context) || '';
3745
const afterSignInUrl = overrides.afterSignInUrl || getEnvVariable('CLERK_AFTER_SIGN_IN_URL', context) || '';
3846
const afterSignUpUrl = overrides.afterSignUpUrl || getEnvVariable('CLERK_AFTER_SIGN_UP_URL', context) || '';
3947

@@ -68,5 +76,9 @@ export const loadOptions = (args: LoaderFunctionArgs, overrides: RootAuthLoaderO
6876
signUpUrl,
6977
afterSignInUrl,
7078
afterSignUpUrl,
79+
signInForceRedirectUrl,
80+
signUpForceRedirectUrl,
81+
signInFallbackRedirectUrl,
82+
signUpFallbackRedirectUrl,
7183
};
7284
};

packages/remix/src/ssr/rootAuthLoader.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ export const rootAuthLoader: RootAuthLoader = async (
4949

5050
const loadedOptions = loadOptions(args, opts);
5151
// Note: authenticateRequest() will throw a redirect if the auth state is determined to be handshake
52-
const requestState = await authenticateRequest(args, loadedOptions);
52+
const _requestState = await authenticateRequest(args, loadedOptions);
53+
// TODO: Investigate if `authenticateRequest` needs to return the loadedOptions (the new request urls in particular)
54+
const requestState = { ...loadedOptions, ..._requestState };
5355

5456
if (!handler) {
5557
// if the user did not provide a handler, simply inject requestState into an empty response

packages/remix/src/ssr/types.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import type { Organization, Session, User, VerifyTokenOptions } from '@clerk/backend';
2-
import type { AuthObject } from '@clerk/backend/internal';
3-
import type { MultiDomainAndOrProxy } from '@clerk/types';
2+
import type { AuthObject, RequestState } from '@clerk/backend/internal';
3+
import type {
4+
LegacyRedirectProps,
5+
MultiDomainAndOrProxy,
6+
SignInFallbackRedirectUrl,
7+
SignInForceRedirectUrl,
8+
SignUpFallbackRedirectUrl,
9+
SignUpForceRedirectUrl,
10+
} from '@clerk/types';
411
import type { DataFunctionArgs, LoaderFunction } from '@remix-run/server-runtime';
512

613
export type GetAuthReturn = Promise<AuthObject>;
@@ -27,10 +34,20 @@ export type RootAuthLoaderOptions = {
2734
authorizedParties?: [];
2835
signInUrl?: string;
2936
signUpUrl?: string;
30-
afterSignInUrl?: string;
31-
afterSignUpUrl?: string;
3237
} & Pick<VerifyTokenOptions, 'audience'> &
33-
MultiDomainAndOrProxy;
38+
MultiDomainAndOrProxy &
39+
SignInForceRedirectUrl &
40+
SignInFallbackRedirectUrl &
41+
SignUpForceRedirectUrl &
42+
SignUpFallbackRedirectUrl &
43+
LegacyRedirectProps;
44+
45+
export type RequestStateWithRedirectUrls = RequestState &
46+
SignInForceRedirectUrl &
47+
SignInFallbackRedirectUrl &
48+
SignUpForceRedirectUrl &
49+
SignUpFallbackRedirectUrl &
50+
LegacyRedirectProps;
3451

3552
export type RootAuthLoaderCallback<Options extends RootAuthLoaderOptions> = (
3653
args: LoaderFunctionArgsWithAuth<Options>,

packages/remix/src/ssr/utils.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import type { RequestState } from '@clerk/backend/internal';
21
import { constants, debugRequestState } from '@clerk/backend/internal';
32
import { isTruthy } from '@clerk/shared/underscore';
43
import type { AppLoadContext, defer } from '@remix-run/server-runtime';
54
import { json } from '@remix-run/server-runtime';
65
import cookie from 'cookie';
76

87
import { getEnvVariable } from '../utils/utils';
8+
import type { RequestStateWithRedirectUrls } from './types';
99

1010
export function isResponse(value: any): value is Response {
1111
return (
@@ -33,7 +33,7 @@ export function assertValidHandlerResult(val: any, error?: string): asserts val
3333

3434
export const injectRequestStateIntoResponse = async (
3535
response: Response,
36-
requestState: RequestState,
36+
requestState: RequestStateWithRedirectUrls,
3737
context: AppLoadContext,
3838
) => {
3939
const clone = new Response(response.body, response);
@@ -53,7 +53,7 @@ export const injectRequestStateIntoResponse = async (
5353

5454
export function injectRequestStateIntoDeferredData(
5555
data: ReturnType<typeof defer>,
56-
requestState: RequestState,
56+
requestState: RequestStateWithRedirectUrls,
5757
context: AppLoadContext,
5858
) {
5959
const { clerkState, headers } = getResponseClerkState(requestState, context);
@@ -78,7 +78,7 @@ export function injectRequestStateIntoDeferredData(
7878
*
7979
* @internal
8080
*/
81-
export function getResponseClerkState(requestState: RequestState, context: AppLoadContext) {
81+
export function getResponseClerkState(requestState: RequestStateWithRedirectUrls, context: AppLoadContext) {
8282
const { reason, message, isSignedIn, ...rest } = requestState;
8383
const clerkState = wrapWithClerkState({
8484
__clerk_ssr_state: rest.toAuth(),
@@ -90,6 +90,10 @@ export function getResponseClerkState(requestState: RequestState, context: AppLo
9090
__signUpUrl: requestState.signUpUrl,
9191
__afterSignInUrl: requestState.afterSignInUrl,
9292
__afterSignUpUrl: requestState.afterSignUpUrl,
93+
__signInForceRedirectUrl: requestState.signInForceRedirectUrl,
94+
__signUpForceRedirectUrl: requestState.signUpForceRedirectUrl,
95+
__signInFallbackRedirectUrl: requestState.signInFallbackRedirectUrl,
96+
__signUpFallbackRedirectUrl: requestState.signUpFallbackRedirectUrl,
9397
__clerk_debug: debugRequestState(requestState),
9498
__clerkJSUrl: getEnvVariable('CLERK_JS', context),
9599
__clerkJSVersion: getEnvVariable('CLERK_JS_VERSION', context),

0 commit comments

Comments
 (0)