diff --git a/packages/cli/src/sso/saml/constants.ts b/packages/cli/src/sso/saml/constants.ts
index 4b1bca0fce..b2dd3f2a9b 100644
--- a/packages/cli/src/sso/saml/constants.ts
+++ b/packages/cli/src/sso/saml/constants.ts
@@ -21,7 +21,7 @@ export class SamlUrls {
static readonly defaultRedirect = '/';
- static readonly samlOnboarding = '/settings/personal'; // TODO:SAML: implement signup page
+ static readonly samlOnboarding = '/saml/onboarding';
}
export const SAML_PREFERENCES_DB_KEY = 'features.saml';
diff --git a/packages/editor-ui/src/constants.ts b/packages/editor-ui/src/constants.ts
index b611b0a436..fb7483df03 100644
--- a/packages/editor-ui/src/constants.ts
+++ b/packages/editor-ui/src/constants.ts
@@ -389,6 +389,7 @@ export enum VIEWS {
USAGE = 'Usage',
LOG_STREAMING_SETTINGS = 'LogStreamingSettingsView',
SSO_SETTINGS = 'SSoSettings',
+ SAML_ONBOARDING = 'SamlOnboarding',
}
export enum FAKE_DOOR_FEATURES {
diff --git a/packages/editor-ui/src/router.ts b/packages/editor-ui/src/router.ts
index 701cb1388f..937cb003a8 100644
--- a/packages/editor-ui/src/router.ts
+++ b/packages/editor-ui/src/router.ts
@@ -38,6 +38,7 @@ import { useSSOStore } from './stores/sso';
import SettingsUsageAndPlanVue from './views/SettingsUsageAndPlan.vue';
import SettingsSso from './views/SettingsSso.vue';
import SignoutView from '@/views/SignoutView.vue';
+import SamlOnboarding from '@/views/SamlOnboarding.vue';
Vue.use(Router);
@@ -670,6 +671,34 @@ export const routes = [
},
],
},
+ {
+ path: '/saml/onboarding',
+ name: VIEWS.SAML_ONBOARDING,
+ components: {
+ default: SamlOnboarding,
+ },
+ meta: {
+ telemetry: {
+ pageCategory: 'auth',
+ },
+ permissions: {
+ allow: {
+ loginStatus: [LOGIN_STATUS.LoggedIn],
+ },
+ deny: {
+ shouldDeny: () => {
+ const settingsStore = useSettingsStore();
+ const ssoStore = useSSOStore();
+ return (
+ !ssoStore.isEnterpriseSamlEnabled ||
+ settingsStore.isCloudDeployment ||
+ settingsStore.isDesktopDeployment
+ );
+ },
+ },
+ },
+ },
+ },
{
path: '*',
name: VIEWS.NOT_FOUND,
diff --git a/packages/editor-ui/src/stores/sso.ts b/packages/editor-ui/src/stores/sso.ts
index 229bf99ec4..a897e824ab 100644
--- a/packages/editor-ui/src/stores/sso.ts
+++ b/packages/editor-ui/src/stores/sso.ts
@@ -5,10 +5,13 @@ import { useRootStore } from '@/stores/n8nRootStore';
import { useSettingsStore } from '@/stores/settings';
import * as ssoApi from '@/api/sso';
import { SamlPreferences } from '@/Interface';
+import { updateCurrentUser } from '@/api/users';
+import { useUsersStore } from '@/stores/users';
export const useSSOStore = defineStore('sso', () => {
const rootStore = useRootStore();
const settingsStore = useSettingsStore();
+ const usersStore = useUsersStore();
const state = reactive({
loading: false,
@@ -58,6 +61,13 @@ export const useSSOStore = defineStore('sso', () => {
ssoApi.saveSamlConfig(rootStore.getRestApiContext, config);
const testSamlConfig = () => ssoApi.testSamlConfig(rootStore.getRestApiContext);
+ const updateUser = async (params: { firstName: string; lastName: string }) =>
+ updateCurrentUser(rootStore.getRestApiContext, {
+ id: usersStore.currentUser!.id,
+ email: usersStore.currentUser!.email!,
+ ...params,
+ });
+
return {
isLoading,
setLoading,
@@ -69,5 +79,6 @@ export const useSSOStore = defineStore('sso', () => {
getSamlConfig,
saveSamlConfig,
testSamlConfig,
+ updateUser,
};
});
diff --git a/packages/editor-ui/src/views/SamlOnboarding.vue b/packages/editor-ui/src/views/SamlOnboarding.vue
new file mode 100644
index 0000000000..044aa99a75
--- /dev/null
+++ b/packages/editor-ui/src/views/SamlOnboarding.vue
@@ -0,0 +1,44 @@
+
+
+
+
+