diff --git a/.changeset/few-falcons-boil.md b/.changeset/few-falcons-boil.md new file mode 100644 index 00000000..b094c888 --- /dev/null +++ b/.changeset/few-falcons-boil.md @@ -0,0 +1,12 @@ +--- +'@asgardeo/browser': patch +'@asgardeo/express': patch +'@asgardeo/javascript': patch +'@asgardeo/nextjs': patch +'@asgardeo/node': patch +'@asgardeo/react': patch +'@asgardeo/react-router': patch +'@asgardeo/vue': patch +--- + +Update Sign In diff --git a/packages/express/src/AsgardeoExpressClient.ts b/packages/express/src/AsgardeoExpressClient.ts index 61b0c9c7..577065a8 100644 --- a/packages/express/src/AsgardeoExpressClient.ts +++ b/packages/express/src/AsgardeoExpressClient.ts @@ -16,7 +16,7 @@ * under the License. */ -import {LegacyAsgardeoNodeClient, SignOutOptions} from '@asgardeo/node'; +import {LegacyAsgardeoNodeClient} from '@asgardeo/node'; import {AsgardeoExpressConfig} from './models/config'; /** diff --git a/packages/javascript/src/AsgardeoJavaScriptClient.ts b/packages/javascript/src/AsgardeoJavaScriptClient.ts index 0b185e26..9d571717 100644 --- a/packages/javascript/src/AsgardeoJavaScriptClient.ts +++ b/packages/javascript/src/AsgardeoJavaScriptClient.ts @@ -17,8 +17,8 @@ */ import {AllOrganizationsApiResponse} from './models/organization'; -import {AsgardeoClient, SignInOptions, SignOutOptions, SignUpOptions} from './models/client'; -import {Config} from './models/config'; +import {AsgardeoClient} from './models/client'; +import {Config, SignInOptions, SignOutOptions, SignUpOptions} from './models/config'; import {Storage} from './models/store'; import {EmbeddedFlowExecuteRequestPayload, EmbeddedFlowExecuteResponse} from './models/embedded-flow'; import {EmbeddedSignInFlowHandleRequestPayload} from './models/embedded-signin-flow'; diff --git a/packages/javascript/src/index.ts b/packages/javascript/src/index.ts index 813f10e2..2c9e3217 100644 --- a/packages/javascript/src/index.ts +++ b/packages/javascript/src/index.ts @@ -75,8 +75,18 @@ export { EmbeddedFlowExecuteRequestConfig, } from './models/embedded-flow'; export {FlowMode} from './models/flow'; -export {AsgardeoClient, SignInOptions, SignOutOptions, SignUpOptions} from './models/client'; -export {BaseConfig, Config, Preferences, ThemePreferences, I18nPreferences, WithPreferences} from './models/config'; +export {AsgardeoClient} from './models/client'; +export { + BaseConfig, + Config, + Preferences, + ThemePreferences, + I18nPreferences, + WithPreferences, + SignInOptions, + SignOutOptions, + SignUpOptions, +} from './models/config'; export {TokenResponse, IdToken, TokenExchangeRequestConfig} from './models/token'; export {Crypto, JWKInterface} from './models/crypto'; export {OAuthResponseMode} from './models/oauth-response'; diff --git a/packages/javascript/src/models/client.ts b/packages/javascript/src/models/client.ts index d67334fb..b5f8ec55 100644 --- a/packages/javascript/src/models/client.ts +++ b/packages/javascript/src/models/client.ts @@ -27,10 +27,7 @@ import {Organization} from './organization'; import {User, UserProfile} from './user'; import {TokenResponse} from './token'; import {Storage} from './store'; - -export type SignInOptions = Record; -export type SignOutOptions = Record; -export type SignUpOptions = Record; +import {SignInOptions, SignOutOptions, SignUpOptions} from './config'; /** * Interface defining the core functionality for Asgardeo authentication clients. diff --git a/packages/javascript/src/models/config.ts b/packages/javascript/src/models/config.ts index 68cb0055..6791e60c 100644 --- a/packages/javascript/src/models/config.ts +++ b/packages/javascript/src/models/config.ts @@ -20,6 +20,39 @@ import {I18nBundle} from './i18n'; import {RecursivePartial} from './utility-types'; import {ThemeConfig, ThemeMode} from '../theme/types'; +/** + * Interface representing the additional parameters to be sent in the sign-in request. + * This can include custom parameters that your authorization server supports. + * These parameters will be included in the authorization request sent to the server. + * If not provided, no additional parameters will be sent. + * + * @example + * signInOptions: { prompt: "login", fidp: "OrganizationSSO" } + */ +export type SignInOptions = Record; + +/** + * Interface representing the additional parameters to be sent in the sign-out request. + * This can include custom parameters that your authorization server supports. + * These parameters will be included in the sign-out request sent to the server. + * If not provided, no additional parameters will be sent. + * + * @example + * signOutOptions: { idTokenHint: "your-id-token-hint" } + */ +export type SignOutOptions = Record; + +/** + * Interface representing the additional parameters to be sent in the sign-up request. + * This can include custom parameters that your authorization server supports. + * These parameters will be included in the sign-up request sent to the server. + * If not provided, no additional parameters will be sent. + * + * @example + * signUpOptions: { appId: "your-app-id" } + */ +export type SignUpOptions = Record; + export interface BaseConfig extends WithPreferences { /** * Optional URL where the authorization server should redirect after authentication. @@ -134,6 +167,24 @@ export interface BaseConfig extends WithPreferences { clockTolerance?: number; }; }; + + /** + * Optional additional parameters to be sent in the authorize request. + * @see {@link SignInOptions} for more details. + */ + signInOptions?: SignInOptions; + + /** + * Optional additional parameters to be sent in the sign-out request. + * @see {@link SignOutOptions} for more details. + */ + signOutOptions?: SignOutOptions; + + /** + * Optional additional parameters to be sent in the sign-up request. + * @see {@link SignUpOptions} for more details. + */ + signUpOptions?: SignUpOptions; } export interface WithPreferences { diff --git a/packages/nextjs/src/client/components/actions/SignInButton/SignInButton.tsx b/packages/nextjs/src/client/components/actions/SignInButton/SignInButton.tsx index a28bc98d..00da5e2a 100644 --- a/packages/nextjs/src/client/components/actions/SignInButton/SignInButton.tsx +++ b/packages/nextjs/src/client/components/actions/SignInButton/SignInButton.tsx @@ -27,7 +27,12 @@ import {useRouter} from 'next/navigation'; /** * Props interface of {@link SignInButton} */ -export type SignInButtonProps = BaseSignInButtonProps; +export type SignInButtonProps = BaseSignInButtonProps & { + /** + * Additional parameters to pass to the `authorize` request. + */ + signInOptions?: Record; +} /** * SignInButton component that uses server actions for authentication in Next.js. @@ -55,7 +60,7 @@ export type SignInButtonProps = BaseSignInButtonProps; */ const SignInButton = forwardRef( ( - {className, style, children, preferences, onClick, ...rest}: SignInButtonProps, + {className, style, children, preferences, onClick, signInOptions = {}, ...rest}: SignInButtonProps, ref: Ref, ): ReactElement => { const {signIn, signInUrl} = useAsgardeo(); @@ -72,7 +77,7 @@ const SignInButton = forwardRef( if (signInUrl) { router.push(signInUrl); } else { - await signIn(); + await signIn(signInOptions); } if (onClick) { diff --git a/packages/node/src/AsgardeoNodeClient.ts b/packages/node/src/AsgardeoNodeClient.ts index ec6d6583..e65df081 100644 --- a/packages/node/src/AsgardeoNodeClient.ts +++ b/packages/node/src/AsgardeoNodeClient.ts @@ -18,7 +18,6 @@ import {AsgardeoJavaScriptClient} from '@asgardeo/javascript'; import {AsgardeoNodeConfig} from './models/config'; -import {SignOutOptions} from '@asgardeo/javascript/dist/models/client'; /** * Base class for implementing Asgardeo in Node.js based applications. diff --git a/packages/react/src/components/actions/SignInButton/SignInButton.tsx b/packages/react/src/components/actions/SignInButton/SignInButton.tsx index dcd7b5e9..18941829 100644 --- a/packages/react/src/components/actions/SignInButton/SignInButton.tsx +++ b/packages/react/src/components/actions/SignInButton/SignInButton.tsx @@ -25,7 +25,12 @@ import useTranslation from '../../../hooks/useTranslation'; /** * Props interface of {@link SignInButton} */ -export type SignInButtonProps = BaseSignInButtonProps; +export type SignInButtonProps = BaseSignInButtonProps & { + /** + * Additional parameters to pass to the `authorize` request. + */ + signInOptions?: Record; +}; /** * SignInButton component that supports both render props and traditional props patterns. @@ -70,8 +75,8 @@ export type SignInButtonProps = BaseSignInButtonProps; const SignInButton: ForwardRefExoticComponent> = forwardRef< HTMLButtonElement, SignInButtonProps ->(({children, onClick, preferences, ...rest}: SignInButtonProps, ref: Ref): ReactElement => { - const {signIn, signInUrl} = useAsgardeo(); +>(({children, onClick, preferences, signInOptions: overriddenSignInOptions = {}, ...rest}: SignInButtonProps, ref: Ref): ReactElement => { + const {signIn, signInUrl, signInOptions} = useAsgardeo(); const {t} = useTranslation(preferences?.i18n); const [isLoading, setIsLoading] = useState(false); @@ -86,7 +91,7 @@ const SignInButton: ForwardRefExoticComponent Promise[]>; }; + /** + * Optional additional parameters to be sent in the sign-in request. + * This can include custom parameters that your authorization server supports. + * These parameters will be included in the authorization request sent to the server. + * If not provided, no additional parameters will be sent. + * + * @example + * signInOptions: { prompt: "login", fidp: "OrganizationSSO" } + */ + signInOptions?: SignInOptions; }; /** @@ -104,6 +114,7 @@ const AsgardeoContext: Context = createContext null, requestAll: () => null, }, + signInOptions: {}, }); AsgardeoContext.displayName = 'AsgardeoContext'; diff --git a/packages/react/src/contexts/Asgardeo/AsgardeoProvider.tsx b/packages/react/src/contexts/Asgardeo/AsgardeoProvider.tsx index b6c55d37..3ef1e71f 100644 --- a/packages/react/src/contexts/Asgardeo/AsgardeoProvider.tsx +++ b/packages/react/src/contexts/Asgardeo/AsgardeoProvider.tsx @@ -56,6 +56,7 @@ const AsgardeoProvider: FC> = ({ signUpUrl, organizationHandle, applicationId, + signInOptions, ...rest }: PropsWithChildren): ReactElement => { const reRenderCheckRef: RefObject = useRef(false); @@ -81,6 +82,7 @@ const AsgardeoProvider: FC> = ({ scopes, signUpUrl, signInUrl, + signInOptions, ...rest, }); @@ -393,6 +395,7 @@ const AsgardeoProvider: FC> = ({ request: asgardeo.request.bind(asgardeo), requestAll: asgardeo.requestAll.bind(asgardeo), }, + signInOptions }), [ applicationId, @@ -409,6 +412,7 @@ const AsgardeoProvider: FC> = ({ signInSilently, user, asgardeo, + signInOptions ], );