Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .changeset/dirty-keys-heal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
'@clerk/clerk-js': patch
'@clerk/types': patch
---

Add `oidcPrompt` prop to `SignIn` and `SignUp` components and `authenticateWithRedirect` method to control the OIDC authentication prompt behavior during Enterprise SSO flows

```tsx
<SignUp oidcPrompt='select_account' />
<SignIn oidcPrompt='select_account' />
```

```ts
signUp.authenticateWithRedirect({ redirectUrl: '/sso-callback', oidcPrompt: 'select_account' })
```
6 changes: 3 additions & 3 deletions packages/clerk-js/bundlewatch.config.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"files": [
{ "path": "./dist/clerk.js", "maxSize": "595.7kB" },
{ "path": "./dist/clerk.js", "maxSize": "598KB" },
{ "path": "./dist/clerk.browser.js", "maxSize": "68.5KB" },
{ "path": "./dist/clerk.legacy.browser.js", "maxSize": "110KB" },
{ "path": "./dist/clerk.legacy.browser.js", "maxSize": "113KB" },
{ "path": "./dist/clerk.headless*.js", "maxSize": "52KB" },
{ "path": "./dist/ui-common*.js", "maxSize": "105.1KB" },
{ "path": "./dist/vendors*.js", "maxSize": "39.5KB" },
Expand All @@ -13,7 +13,7 @@
{ "path": "./dist/organizationswitcher*.js", "maxSize": "5KB" },
{ "path": "./dist/organizationlist*.js", "maxSize": "5.5KB" },
{ "path": "./dist/signin*.js", "maxSize": "14KB" },
{ "path": "./dist/signup*.js", "maxSize": "7.4KB" },
{ "path": "./dist/signup*.js", "maxSize": "7.7KB" },
{ "path": "./dist/userbutton*.js", "maxSize": "5KB" },
{ "path": "./dist/userprofile*.js", "maxSize": "16.5KB" },
{ "path": "./dist/userverification*.js", "maxSize": "5KB" },
Expand Down
5 changes: 4 additions & 1 deletion packages/clerk-js/src/core/resources/SignIn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ export class SignIn extends BaseResource implements SignInResource {
config = {
redirectUrl: factor.redirectUrl,
actionCompleteRedirectUrl: factor.actionCompleteRedirectUrl,
oidcPrompt: factor.oidcPrompt,
} as EnterpriseSSOConfig;
break;
default:
Expand Down Expand Up @@ -231,20 +232,22 @@ export class SignIn extends BaseResource implements SignInResource {
params: AuthenticateWithRedirectParams,
navigateCallback: (url: URL | string) => void,
): Promise<void> => {
const { strategy, redirectUrl, redirectUrlComplete, identifier } = params || {};
const { strategy, redirectUrl, redirectUrlComplete, identifier, oidcPrompt } = params || {};

const { firstFactorVerification } =
(strategy === 'saml' || strategy === 'enterprise_sso') && this.id
? await this.prepareFirstFactor({
strategy,
redirectUrl: SignIn.clerk.buildUrlWithAuth(redirectUrl),
actionCompleteRedirectUrl: redirectUrlComplete,
oidcPrompt,
})
: await this.create({
strategy,
identifier,
redirectUrl: SignIn.clerk.buildUrlWithAuth(redirectUrl),
actionCompleteRedirectUrl: redirectUrlComplete,
oidcPrompt,
});

const { status, externalVerificationRedirectURL } = firstFactorVerification;
Expand Down
2 changes: 2 additions & 0 deletions packages/clerk-js/src/core/resources/SignUp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,7 @@ export class SignUp extends BaseResource implements SignUpResource {
unsafeMetadata,
emailAddress,
legalAccepted,
oidcPrompt,
} = params;

const authenticateFn = () => {
Expand All @@ -316,6 +317,7 @@ export class SignUp extends BaseResource implements SignUpResource {
unsafeMetadata,
emailAddress,
legalAccepted,
oidcPrompt,
};
return continueSignUp && this.id ? this.update(authParams) : this.create(authParams);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,12 @@ export const SignInSocialButtons = React.memo((props: SignInSocialButtonsProps)
}, 500);

return signIn
.authenticateWithPopup({ strategy, redirectUrl, redirectUrlComplete, popup })
.authenticateWithPopup({ strategy, redirectUrl, redirectUrlComplete, popup, oidcPrompt: ctx.oidcPrompt })
.catch(err => handleError(err, [], card.setError));
}

return signIn
.authenticateWithRedirect({ strategy, redirectUrl, redirectUrlComplete })
.authenticateWithRedirect({ strategy, redirectUrl, redirectUrlComplete, oidcPrompt: ctx.oidcPrompt })
.catch(err => handleError(err, [], card.setError));
}}
web3Callback={strategy => {
Expand Down
1 change: 1 addition & 0 deletions packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ function SignInStartInternal(): JSX.Element {
strategy: 'enterprise_sso',
redirectUrl,
redirectUrlComplete,
oidcPrompt: ctx.oidcPrompt,
});
};

Expand Down
2 changes: 2 additions & 0 deletions packages/clerk-js/src/ui/components/SignUp/SignUpContinue.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ function SignUpContinueInternal() {
const [activeCommIdentifierType, setActiveCommIdentifierType] = React.useState<ActiveIdentifier>(
getInitialActiveIdentifier(attributes, userSettings.signUp.progressive),
);
const ctx = useSignUpContext();

// TODO: This form should be shared between SignUpStart and SignUpContinue
const formState = {
Expand Down Expand Up @@ -179,6 +180,7 @@ function SignUpContinueInternal() {
verifyPhonePath: './verify-phone-number',
handleComplete: () => clerk.setActive({ session: res.createdSessionId, redirectUrl: afterSignUpUrl }),
navigate,
oidcPrompt: ctx.oidcPrompt,
}),
)
.catch(err => handleError(err, fieldsToSubmit, card.setError))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
continueSignUp,
unsafeMetadata: ctx.unsafeMetadata,
legalAccepted: props.legalAccepted,
oidcPrompt: ctx.oidcPrompt,
})
.catch(err => handleError(err, [], card.setError));
}
Expand All @@ -64,6 +65,7 @@ export const SignUpSocialButtons = React.memo((props: SignUpSocialButtonsProps)
strategy,
unsafeMetadata: ctx.unsafeMetadata,
legalAccepted: props.legalAccepted,
oidcPrompt: ctx.oidcPrompt,
})
.catch(err => handleError(err, [], card.setError));
}}
Expand Down
1 change: 1 addition & 0 deletions packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ function SignUpStartInternal(): JSX.Element {
navigate,
redirectUrl,
redirectUrlComplete,
oidcPrompt: ctx.oidcPrompt,
}),
)
.catch(err => handleError(err, fieldsToSubmit, card.setError))
Expand Down
3 changes: 3 additions & 0 deletions packages/clerk-js/src/utils/completeSignUpFlow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ type CompleteSignUpFlowProps = {
handleComplete?: () => Promise<void>;
redirectUrl?: string;
redirectUrlComplete?: string;
oidcPrompt?: string;
};

export const completeSignUpFlow = ({
Expand All @@ -20,6 +21,7 @@ export const completeSignUpFlow = ({
handleComplete,
redirectUrl = '',
redirectUrlComplete = '',
oidcPrompt,
}: CompleteSignUpFlowProps): Promise<unknown> | undefined => {
if (signUp.status === 'complete') {
return handleComplete && handleComplete();
Expand All @@ -30,6 +32,7 @@ export const completeSignUpFlow = ({
redirectUrl,
redirectUrlComplete,
continueSignUp: true,
oidcPrompt,
});
}

Expand Down
8 changes: 8 additions & 0 deletions packages/types/src/clerk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,10 @@ export type SignInProps = RoutingOptions & {
* Control whether OAuth flows use redirects or popups.
*/
oauthFlow?: 'auto' | 'redirect' | 'popup';
/**
* Optional for `oauth_<provider>` or `enterprise_sso` strategies. The value to pass to the [OIDC prompt parameter](https://openid.net/specs/openid-connect-core-1_0.html#:~:text=prompt,reauthentication%20and%20consent.) in the generated OAuth redirect URL.
*/
oidcPrompt?: string;
} & TransferableOption &
SignUpForceRedirectUrl &
SignUpFallbackRedirectUrl &
Expand Down Expand Up @@ -1254,6 +1258,10 @@ export type SignUpProps = RoutingOptions & {
* Control whether OAuth flows use redirects or popups.
*/
oauthFlow?: 'auto' | 'redirect' | 'popup';
/**
* Optional for `oauth_<provider>` or `enterprise_sso` strategies. The value to pass to the [OIDC prompt parameter](https://openid.net/specs/openid-connect-core-1_0.html#:~:text=prompt,reauthentication%20and%20consent.) in the generated OAuth redirect URL.
*/
oidcPrompt?: string;
} & SignInFallbackRedirectUrl &
SignInForceRedirectUrl &
LegacyRedirectProps &
Expand Down
1 change: 1 addition & 0 deletions packages/types/src/factors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ export type SamlConfig = SamlFactor & {
export type EnterpriseSSOConfig = EnterpriseSSOFactor & {
redirectUrl: string;
actionCompleteRedirectUrl: string;
oidcPrompt?: string;
};

export type PhoneCodeSecondFactorConfig = {
Expand Down
5 changes: 5 additions & 0 deletions packages/types/src/redirects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,11 @@ export type AuthenticateWithRedirectParams = {
* Whether the user has accepted the legal requirements.
*/
legalAccepted?: boolean;

/**
* Optional for `oauth_<provider>` or `enterprise_sso` strategies. The value to pass to the [OIDC prompt parameter](https://openid.net/specs/openid-connect-core-1_0.html#:~:text=prompt,reauthentication%20and%20consent.) in the generated OAuth redirect URL.
*/
oidcPrompt?: string;
};

export type AuthenticateWithPopupParams = AuthenticateWithRedirectParams & { popup: Window | null };
Expand Down