Skip to content

Commit f3d7e78

Browse files
fix(auth-next-server): resolve redirectUri from env vars in zero-config
- Add resolveDefaultRedirectUri: NEXT_PUBLIC_REDIRECT_URI > NEXTAUTH_URL + path > AUTH_URL + path > path-only - Fix sample app getAuthConfig to use POPUP_REDIRECT_URI for Auth NextJS (fixes callback URL mismatch in production)
1 parent a646800 commit f3d7e78

2 files changed

Lines changed: 22 additions & 7 deletions

File tree

packages/auth-next-server/src/config.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,20 @@ async function validateTokens(
5656
}
5757
}
5858

59+
/**
60+
* Resolve redirect URI for zero-config mode.
61+
* Priority: NEXT_PUBLIC_REDIRECT_URI > NEXTAUTH_URL + path > AUTH_URL + path > path-only.
62+
*/
63+
function resolveDefaultRedirectUri(): string {
64+
const fromEnv = process.env.NEXT_PUBLIC_REDIRECT_URI;
65+
if (fromEnv) return fromEnv;
66+
const nextAuthUrl = process.env.NEXTAUTH_URL;
67+
if (nextAuthUrl) return new URL(DEFAULT_REDIRECT_URI_PATH, nextAuthUrl).href;
68+
const authUrl = process.env.AUTH_URL;
69+
if (authUrl) return new URL(DEFAULT_REDIRECT_URI_PATH, authUrl).href;
70+
return DEFAULT_REDIRECT_URI_PATH;
71+
}
72+
5973
/**
6074
* Create Auth.js v5 configuration for Immutable authentication.
6175
*
@@ -87,10 +101,12 @@ async function validateTokens(
87101
* ```
88102
*/
89103
export function createAuthConfig(config?: ImmutableAuthConfig): NextAuthConfig {
90-
const resolvedConfig: ImmutableAuthConfig = config ?? {
91-
clientId: DEFAULT_SANDBOX_CLIENT_ID,
92-
redirectUri: DEFAULT_REDIRECT_URI_PATH,
93-
};
104+
const resolvedConfig: ImmutableAuthConfig = config
105+
? { ...config }
106+
: {
107+
clientId: DEFAULT_SANDBOX_CLIENT_ID,
108+
redirectUri: resolveDefaultRedirectUri(),
109+
};
94110
const authDomain = resolvedConfig.authenticationDomain || DEFAULT_AUTH_DOMAIN;
95111

96112
return {

packages/passport/sdk-sample-app/src/lib/immutable-auth.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import type { ImmutableAuthConfig } from "@imtbl/auth-next-server";
88
import { DEFAULT_SANDBOX_CLIENT_ID } from "@imtbl/auth-next-server";
99
import { EnvironmentNames } from "@/types";
10-
import { BASE_PATH } from "@/config";
10+
import { BASE_PATH, POPUP_REDIRECT_URI } from "@/config";
1111

1212
// Client IDs for each environment (same as ImmutableProvider)
1313
const CLIENT_IDS: Partial<Record<EnvironmentNames, string>> = {
@@ -28,10 +28,9 @@ const AUTH_DOMAINS: Record<EnvironmentNames, string> = {
2828
// Get auth config for a specific environment
2929
export function getAuthConfig(environment: EnvironmentNames): ImmutableAuthConfig {
3030
const baseUrl = typeof window !== "undefined" ? window.location.origin : "http://localhost:3000";
31-
3231
return {
3332
clientId: environment === EnvironmentNames.DEFAULT ? DEFAULT_SANDBOX_CLIENT_ID : CLIENT_IDS[environment]!,
34-
redirectUri: `${baseUrl}${BASE_PATH}/callback`,
33+
redirectUri: POPUP_REDIRECT_URI || `${baseUrl}${BASE_PATH}/callback`,
3534
audience: "platform_api",
3635
scope: "openid profile email offline_access transact",
3736
authenticationDomain: AUTH_DOMAINS[environment],

0 commit comments

Comments
 (0)