## What it does ### Backend - [x] Add a mutation to create OIDC and SAML configuration - [x] Add a mutation to delete an SSO config - [x] Add a feature flag to toggle SSO - [x] Add a mutation to activate/deactivate an SSO config - [x] Add a mutation to delete an SSO config - [x] Add strategy to use OIDC or SAML - [ ] Improve error management ### Frontend - [x] Add section "security" in settings - [x] Add page to list SSO configurations - [x] Add page and forms to create OIDC or SAML configuration - [x] Add field to "connect with SSO" in the signin/signup process - [x] Trigger auth when a user switch to a workspace with SSO enable - [x] Add an option on the security page to activate/deactivate the global invitation link - [ ] Add new Icons for SSO Identity Providers (okta, Auth0, Azure, Microsoft) --------- Co-authored-by: Félix Malfait <felix@twenty.com> Co-authored-by: Charles Bochet <charles@twenty.com>
87 lines
3.1 KiB
TypeScript
87 lines
3.1 KiB
TypeScript
/* @license Enterprise */
|
|
|
|
import { SaveAndCancelButtons } from '@/settings/components/SaveAndCancelButtons/SaveAndCancelButtons';
|
|
import SettingsSSOIdentitiesProvidersForm from '@/settings/security/components/SettingsSSOIdentitiesProvidersForm';
|
|
import { useCreateSSOIdentityProvider } from '@/settings/security/hooks/useCreateSSOIdentityProvider';
|
|
import { SettingSecurityNewSSOIdentityFormValues } from '@/settings/security/types/SSOIdentityProvider';
|
|
import { sSOIdentityProviderDefaultValues } from '@/settings/security/utils/sSOIdentityProviderDefaultValues';
|
|
import { SSOIdentitiesProvidersParamsSchema } from '@/settings/security/validation-schemas/SSOIdentityProviderSchema';
|
|
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
|
import { SettingsPath } from '@/types/SettingsPath';
|
|
import { SnackBarVariant } from '@/ui/feedback/snack-bar-manager/components/SnackBar';
|
|
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
|
|
import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer';
|
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
import { useEffect } from 'react';
|
|
import { FormProvider, useForm } from 'react-hook-form';
|
|
import { useNavigate } from 'react-router-dom';
|
|
|
|
export const SettingsSecuritySSOIdentifyProvider = () => {
|
|
const navigate = useNavigate();
|
|
|
|
const { enqueueSnackBar } = useSnackBar();
|
|
const { createSSOIdentityProvider } = useCreateSSOIdentityProvider();
|
|
|
|
const formConfig = useForm<SettingSecurityNewSSOIdentityFormValues>({
|
|
mode: 'onChange',
|
|
resolver: zodResolver(SSOIdentitiesProvidersParamsSchema),
|
|
defaultValues: Object.values(sSOIdentityProviderDefaultValues).reduce(
|
|
(acc, fn) => ({ ...acc, ...fn() }),
|
|
{},
|
|
),
|
|
});
|
|
|
|
const selectedType = formConfig.watch('type');
|
|
|
|
useEffect(
|
|
() =>
|
|
formConfig.reset({
|
|
...sSOIdentityProviderDefaultValues[selectedType](),
|
|
name: formConfig.getValues('name'),
|
|
}),
|
|
[formConfig, selectedType],
|
|
);
|
|
|
|
const handleSave = async () => {
|
|
try {
|
|
await createSSOIdentityProvider(formConfig.getValues());
|
|
navigate(getSettingsPagePath(SettingsPath.Security));
|
|
} catch (error) {
|
|
enqueueSnackBar((error as Error).message, {
|
|
variant: SnackBarVariant.Error,
|
|
});
|
|
}
|
|
};
|
|
|
|
return (
|
|
<SubMenuTopBarContainer
|
|
title="New SSO Configuration"
|
|
actionButton={
|
|
<SaveAndCancelButtons
|
|
isSaveDisabled={!formConfig.formState.isValid}
|
|
onCancel={() => navigate(getSettingsPagePath(SettingsPath.Security))}
|
|
onSave={handleSave}
|
|
/>
|
|
}
|
|
links={[
|
|
{
|
|
children: 'Workspace',
|
|
href: getSettingsPagePath(SettingsPath.Workspace),
|
|
},
|
|
{
|
|
children: 'Security',
|
|
href: getSettingsPagePath(SettingsPath.Security),
|
|
},
|
|
{ children: 'New' },
|
|
]}
|
|
>
|
|
<FormProvider
|
|
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
{...formConfig}
|
|
>
|
|
<SettingsSSOIdentitiesProvidersForm />
|
|
</FormProvider>
|
|
</SubMenuTopBarContainer>
|
|
);
|
|
};
|