diff --git a/packages/frontend/@n8n/i18n/src/locales/en.json b/packages/frontend/@n8n/i18n/src/locales/en.json index 37ac9eefcb4..98810df853a 100644 --- a/packages/frontend/@n8n/i18n/src/locales/en.json +++ b/packages/frontend/@n8n/i18n/src/locales/en.json @@ -3596,6 +3596,7 @@ "settings.serviceAccounts.actions.actAs": "Act as this account", "settings.serviceAccounts.actions.disable": "Disable", "settings.serviceAccounts.actions.enable": "Enable", + "settings.serviceAccounts.actions.createCredential": "Create credential", "settings.serviceAccounts.actions.delete": "Delete", "settings.serviceAccounts.createModal.title": "Create service account", "settings.serviceAccounts.createModal.name.label": "Name", @@ -3616,6 +3617,16 @@ "settings.serviceAccounts.enable.success": "Service account enabled", "settings.serviceAccounts.role.success": "Role updated", "settings.serviceAccounts.blockedWhileActingAs": "Return to your own account to manage service accounts.", + "settings.serviceAccounts.credentials.title": "Create credential for {name}", + "settings.serviceAccounts.credentials.description": "Create an OAuth client credential for {name}. The secret is shown once and cannot be retrieved later.", + "settings.serviceAccounts.credentials.warning": "Make sure to copy the client secret now — you will not be able to see it again.", + "settings.serviceAccounts.credentials.clientId": "Client ID", + "settings.serviceAccounts.credentials.clientSecret": "Client secret", + "settings.serviceAccounts.credentials.create": "Create", + "settings.serviceAccounts.credentials.done": "Done", + "settings.serviceAccounts.credentials.success": "Credential created", + "settings.serviceAccounts.credentials.error": "Could not create credential", + "settings.serviceAccounts.credentials.copied": "Copied to clipboard", "impersonation.banner.message": "You're acting as {serviceAccount}. Everything you do here belongs to this service account, not to {actor}.", "impersonation.banner.return": "Return to my account", "impersonation.badge": "Service account", diff --git a/packages/frontend/@n8n/rest-api-client/src/api/service-account-credentials.ts b/packages/frontend/@n8n/rest-api-client/src/api/service-account-credentials.ts new file mode 100644 index 00000000000..cd8a4e30558 --- /dev/null +++ b/packages/frontend/@n8n/rest-api-client/src/api/service-account-credentials.ts @@ -0,0 +1,28 @@ +import type { + CreateServiceAccountCredentialRequestDto, + ServiceAccountCredential, + ServiceAccountCredentialWithSecret, +} from '@n8n/api-types'; + +import type { IRestApiContext } from '../types'; +import { makeRestApiRequest } from '../utils'; + +export async function getServiceAccountCredentials( + context: IRestApiContext, +): Promise { + return await makeRestApiRequest(context, 'GET', '/service-account-credentials'); +} + +export async function createServiceAccountCredential( + context: IRestApiContext, + payload: CreateServiceAccountCredentialRequestDto, +): Promise { + return await makeRestApiRequest(context, 'POST', '/service-account-credentials', payload); +} + +export async function deleteServiceAccountCredential( + context: IRestApiContext, + id: string, +): Promise<{ success: boolean }> { + return await makeRestApiRequest(context, 'DELETE', `/service-account-credentials/${id}`); +} diff --git a/packages/frontend/editor-ui/src/features/settings/serviceAccounts/components/CreateServiceAccountCredentialModal.vue b/packages/frontend/editor-ui/src/features/settings/serviceAccounts/components/CreateServiceAccountCredentialModal.vue new file mode 100644 index 00000000000..dde2b2c8f2f --- /dev/null +++ b/packages/frontend/editor-ui/src/features/settings/serviceAccounts/components/CreateServiceAccountCredentialModal.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/packages/frontend/editor-ui/src/features/settings/serviceAccounts/serviceAccounts.constants.ts b/packages/frontend/editor-ui/src/features/settings/serviceAccounts/serviceAccounts.constants.ts index edd8226d1bd..d11dd64da8f 100644 --- a/packages/frontend/editor-ui/src/features/settings/serviceAccounts/serviceAccounts.constants.ts +++ b/packages/frontend/editor-ui/src/features/settings/serviceAccounts/serviceAccounts.constants.ts @@ -8,6 +8,7 @@ export const SERVICE_ACCOUNT_ACTIONS = { DISABLE: 'disable', ENABLE: 'enable', DELETE: 'delete', + CREATE_CREDENTIAL: 'createCredential', } as const; export const CREATE_SERVICE_ACCOUNT_MODAL_KEY = 'createServiceAccount'; diff --git a/packages/frontend/editor-ui/src/features/settings/serviceAccounts/serviceAccounts.store.ts b/packages/frontend/editor-ui/src/features/settings/serviceAccounts/serviceAccounts.store.ts index 84aa2fdd1ec..8d7f5a2fea4 100644 --- a/packages/frontend/editor-ui/src/features/settings/serviceAccounts/serviceAccounts.store.ts +++ b/packages/frontend/editor-ui/src/features/settings/serviceAccounts/serviceAccounts.store.ts @@ -1,5 +1,6 @@ import type { ServiceAccountsList, UsersListFilterDto } from '@n8n/api-types'; import * as serviceAccountsApi from '@n8n/rest-api-client/api/service-accounts'; +import * as serviceAccountCredentialsApi from '@n8n/rest-api-client/api/service-account-credentials'; import { STORES } from '@n8n/stores'; import { useRootStore } from '@n8n/stores/useRootStore'; import { useAsyncState } from '@vueuse/core'; @@ -35,11 +36,17 @@ export const useServiceAccountsStore = defineStore(STORES.SERVICE_ACCOUNTS, () = const remove = async (id: string) => await serviceAccountsApi.deleteServiceAccount(rootStore.restApiContext, id); + const createCredential = async (userId: string) => + await serviceAccountCredentialsApi.createServiceAccountCredential(rootStore.restApiContext, { + userId, + }); + return { serviceAccountsList, create, update, changeRole, remove, + createCredential, }; }); diff --git a/packages/frontend/editor-ui/src/features/settings/serviceAccounts/views/SettingsServiceAccountsView.vue b/packages/frontend/editor-ui/src/features/settings/serviceAccounts/views/SettingsServiceAccountsView.vue index cacff077642..640cf946528 100644 --- a/packages/frontend/editor-ui/src/features/settings/serviceAccounts/views/SettingsServiceAccountsView.vue +++ b/packages/frontend/editor-ui/src/features/settings/serviceAccounts/views/SettingsServiceAccountsView.vue @@ -1,5 +1,5 @@