Skip to content

Connections and Identity ​

This page covers two Explorer screens. Connections holds the named records of outside systems that flows, triggers, queues and synchronizations call. LDAP / SSO holds the sign-in providers that let people use an existing company account, plus SCIM provisioning. Both are administered by integration owners and tenant administrators. For the vocabulary used here (connection, connector, provider account) see Overview.

Connections ​

A connection records where an outside system lives, how the platform signs in to it, and the secret needed to do so. Flows refer to a connection by its code, so an address or credential changes in one place. One connection can also name a sandbox connection that is used when a flow is tested.

Where to find it ​

Studio Explorer > Workspace > Integrations > Connections. Page key integration-connections. The Integration Flows screen also has a simpler Connections tab that creates REST connections only; this screen is the complete one.

Key concepts ​

TermMeaning
CodeThe identifier flows use. Lower-case letters, digits and dashes, derived from the name; fixed after creation.
Connection typeREST (default), DATABASE, SFTP, GRAPHQL, SOAP, KAFKA, RABBITMQ, SQS, AZURE_SERVICEBUS, GCP_PUBSUB. Stored in the connectionType field.
Sign-in (auth type)How the platform authenticates. See the table below.
Sandbox connectionA second connection used instead of this one when a flow is tested from the designer. Live runs never use it.
Token stateFor OAuth 2 connections, the condition of the access token.

Add connection dialog ​

The dialog opens with a card per kind. Choosing a card sets the sign-in and the fields that follow. The kinds are:

CardAuth type savedConnection type savedPurpose
API keyAPI_KEYRESTA key sent in a header.
Bearer tokenBEARERRESTAuthorization: Bearer token.
Username and passwordBASICRESTHTTP basic authentication.
OAuth 2 (client credentials)OAUTH2_CLIENT_CREDENTIALSRESTServer-to-server token from a token address.
OAuth 2 (a person signs in)OAUTH2_AUTHORIZATION_CODERESTActs on a person's account at a provider after one approval.
No authenticationNONERESTA public address.
SFTP with a passwordPASSWORDSFTPFiles on an SFTP server.
SFTP with an SSH keySSH_KEYSFTPFiles on an SFTP server, private key sign-in.
PostgreSQL databasePASSWORDDATABASEDatabase reads and writes from flows.
Kafka, RabbitMQ, Amazon SQS, Azure Service Bus, Google Cloud Pub/SubPASSWORDKAFKA, RABBITMQ, SQS, AZURE_SERVICEBUS, GCP_PUBSUBA broker a queue can be bridged to.

Fields common to every kind ​

FieldTypeDefaultRequiredDescription
NametextemptyYesDisplay name. The code is generated from it while the connection is new.
Codetextslug of the nameYes"Flows refer to the connection by this code." Disabled when editing.
When testing a flow, useselect"This same connection"NoAnother connection to use for tests. Helper text: "Choose a sandbox connection so tests never touch the live system. Live runs always use this connection." A connection cannot be its own test connection.

REST kinds (API key, Bearer, Basic, OAuth 2, None) ​

FieldApplies toDefaultRequiredDescription
Addressall REST kindsemptyYesBase address, for example https://api.example.com. Step paths are appended to it.
Header nameAPI keyX-Api-KeyYesHeader that carries the key. Saved as authConfig.headerName.
UsernameBasicemptyYesSaved as authConfig.username.
API key / Token / PasswordAPI key, Bearer, BasicemptyYes on createSecret. "Stored on the server and never shown again." When editing: "Leave empty to keep the stored value."

OAuth 2 kinds ​

FieldApplies toDefaultRequiredDescription
Sign-in addressperson signs inemptyYesWhere the provider asks the person to approve access. authConfig.authUrl.
Extra sign-in fieldsperson signs inaccess_type=offlineNoOne name=value per line, added to the sign-in request. A line without a key shows "Line N needs a key, then =, then the value." Many providers need access_type=offline (Google) or offline_access in the scope (Microsoft) to give a refresh token.
Revocation addressperson signs inemptyNoCalled when the connection is disconnected.
Token addressbothemptyYesMust be https. "A token is fetched when needed, renewed before it expires, and shared by every server."
Client IDbothemptyYes
ScopebothemptyNo
AudiencebothemptyNo
Send the client secretbothAs a sign-in headerYesbasic (header, most providers) or body (request body). Saved as clientAuth.
Request formatbothForm (standard)Yesform or json. Saved as requestFormat.
Client secretbothemptyRequired for client credentials; optional for a public client in the person-signs-in kind

For the person-signs-in kind the dialog shows the return address to register with the provider: the Studio origin followed by /app/admin/studio/oauth-callback.

When an OAuth 2 connection is opened for editing the dialog shows the token state and a button: Connect or Reconnect and Disconnect (person signs in), or Get a new token now (client credentials).

Token stateColourText
VALIDgreen"Token valid until HH:MM", with "Connected by NAME" when known
EXPIRINGamber"Token ends at HH:MM, renewing"
NOT_CONNECTEDamber"Not connected yet. Press Connect to sign in."
FAILEDred"Could not get a token: REASON"
NEEDS_RECONNECTred"The sign-in was withdrawn. Connect again."
othergrey"No token yet. One is fetched on first use."

SFTP kinds ​

FieldDefaultRequiredDescription
ServeremptyYesHost name.
Port22YesDigits only, up to five. The saved address is sftp://host:port/ (port omitted when 22).
UsernameemptyYesSaved as authConfig.username.
Password / Private keyemptyYes on createThe key field is a multi-line text box.
Passphrase of the keyemptyOnly if the key has oneKept encrypted together with the key. If a passphrase is entered the key must be pasted again ("Paste the private key again with its passphrase.").
Server identitynot trustedn/aEditing only. Show the server's fingerprint reads the host key; Trust this server pins it. "Nothing is sent to a server until you have confirmed who it is." If the key changed the page warns "This is not the key that was trusted (FINGERPRINT). Trust it only if the change is expected."

PostgreSQL database ​

FieldDefaultRequiredDescription
ServeremptyYes
Port5432Yes
DatabaseemptyYes
Secure connectionEncrypted (require)Yesrequire, verify-ca, verify-full or disable. Saved as authConfig.sslmode. Use verify-full when the server has a certificate you trust; disable only inside a network you control.
UsernameemptyYes
PasswordemptyYes on create

The saved address is postgresql://user@host[:port]/database. Flows use the connection through the db.query and db.write actions. See Integration Flows.

Message brokers ​

FieldApplies toDescription
ServersKafkaComma-separated host:port list. Required.
SecurityKafkaPLAINTEXT (default), SSL, SASL_PLAINTEXT, SASL_SSL.
Sign-in methodKafka with SASLPLAIN (default), SCRAM-SHA-256, SCRAM-SHA-512, OAUTHBEARER. With OAUTHBEARER the Token address (https), Client ID and optional Scope are required and the secret is the client secret.
Certificate authorityKafka with SSLOptional PEM, for a broker certificate issued by your own authority.
Client certificateKafka with SSLOptional PEM chain; the secret is then its private key (PKCS#8 PEM).
AddressRabbitMQamqp:// or amqps://, host, port and virtual host. Required.
Namespace addressAzure Service BusThe https namespace address. Required.
Shared-access policy name / keyAzure Service BusName is required; the key is the secret.
EndpointAmazon SQSOnly for a compatible or private endpoint.
AWS region, Access key id, Secret access keyAmazon SQSRegion and access key id are required.
Google Cloud project idPub/SubRequired. The secret is the service-account key file (JSON); empty only for the local emulator.
Username / PasswordRabbitMQ, Kafka SASLPassword is required when a username is given (RabbitMQ) or when the security needs sign-in.

Brokers carry messages for a queue only. Retries, dead messages and replay work as on any queue. See Queues. Kafka mutual TLS, OAUTHBEARER, Azure Service Bus and Pub/Sub were checked against local stand-ins only, not against the real services.

Save rules ​

The Save connection button is enabled when the name and code are present; a secret is present on create (except None, person-signs-in OAuth and brokers that sign in without one); the SFTP host, username and port are valid; the person-signs-in kind has a sign-in address and valid extra fields; and the broker-specific required fields above are filled.

Grid ​

ColumnContent
ConnectionName and code.
AddressBase address.
Sign-inAuth type chip, with a "credentials set" chip when a secret is stored.
OAuth tokenToken state for OAuth 2 connections, otherwise a dash.
Tests useThe sandbox connection code, or "Same connection".
Last testThe result of the last test in this session: message and latency in ms, or "Not tested".

Chips above the grid: Connections, With credentials, Tested OK, Test failed.

Actions ​

ActionEffectAPI
Add connectionOpens the dialog.
Save connectionCreates or updates by code. If the sandbox choice changed it also sets the test connection. A saved change to the address, client id or secret discards the cached OAuth token.POST /api/v1/integration/connections, PUT /api/v1/integration/connections/{code}/test-connection
Test (row)Chooses the test by type: broker connections call the broker test, SFTP calls the SFTP test, DATABASE calls the database test, everything else a REST test.POST .../{code}/broker/test, .../sftp/test, .../database/test, .../test
Delete (row)Removes the connection and its cached token.DELETE /api/v1/integration/connections/{code}
Connect, ReconnectStarts the OAuth sign-in and sends the browser to the provider.POST .../{code}/oauth/authorize
DisconnectForgets the approval and asks the provider to revoke it when it can.POST .../{code}/oauth/disconnect
Get a new token nowDiscards the cached token and fetches a new one. A refusal returns 502 with the reason.POST .../{code}/token/refresh
Show the server's fingerprint, Trust this serverReads and pins the SFTP host key.POST .../{code}/sftp/host-key, .../sftp/trust

The REST test makes one bounded GET to the address with the credentials applied. Results: "Connected (HTTP N)."; "The address answered, but the credentials were rejected (HTTP 401 or 403)."; "The address answered with a server error (HTTP N)."; "Could not reach the address: ERROR"; "Testing is available for REST connections; this one is TYPE." is returned when the generic test endpoint is called for a connection that is not REST; Studio avoids this by choosing the matching test per type. Address problems return messages such as "The address must use https." and "The address points to a private or internal network, which is not allowed."

Procedure: add a client-credentials connection ​

  1. Select Add connection and the card OAuth 2 (client credentials).
  2. Enter Name Acme CRM. The code becomes acme-crm.
  3. Enter Address https://api.acme.example, Token address https://login.acme.example/oauth/token, Client ID spark-prod, Scope contacts.read.
  4. Leave Send the client secret on "As a sign-in header" and Request format on "Form (standard)". Enter the Client secret.
  5. Select Save connection. Reopen the row and select Get a new token now. The chip should read "Token valid until ...".
  6. Select Test on the row. The Last test column shows "Connected (HTTP 200)." with the latency.

Statuses ​

Connections have no lifecycle. Test results and token states above are the only states.

Permissions ​

integration.flow / view lists connections and reads token status. integration.flow / manage saves, deletes, tests, refreshes tokens, signs in and out, and pins SFTP host keys. Without them the call returns 403 and the screen shows the message.

API and CLI ​

http
POST /api/v1/integration/connections
X-Tenant-Id: 1
Content-Type: application/json

{
  "connectionCode": "acme-crm",
  "name": "Acme CRM",
  "baseUrl": "https://api.acme.example",
  "authType": "OAUTH2_CLIENT_CREDENTIALS",
  "authConfig": {
    "tokenUrl": "https://login.acme.example/oauth/token",
    "clientId": "spark-prod",
    "clientAuth": "basic",
    "requestFormat": "form",
    "scope": "contacts.read"
  },
  "secret": "client-secret-value",
  "connectionType": "REST"
}

The response is the connection without its secret: connectionCode, name, baseUrl, authType, authConfigJson, hasSecret, connectionType, testConnectionCode, createdAt, updatedAt. Other calls: GET /api/v1/integration/connections/{code}/token-status (OAuth only, otherwise 400 "this connection does not use OAuth 2"), POST /api/v1/integration/connections/import-openapi with openApiJson and optional baseUrlOverride (JSON OpenAPI only).

CommandPurpose
erp connection listType, code, secret presence and name for every connection.
erp connection save <code> --name <name> --base-url <url> [--type REST|DATABASE|SFTP|KAFKA|RABBITMQ|SQS|AZURE_SERVICEBUS|GCP_PUBSUB] [--auth-type NONE|PASSWORD|BEARER|...] [--auth-config <json>] [--secret-from-file <path>]Create or update. The secret is read from a file, never an argument.
erp connection test <code>REST test.
erp connection broker-test <code> [--destination <topic-or-queue>]Broker test, optionally against one destination.

Limits and behaviour ​

  • Tokens are fetched when needed, renewed before expiry and shared across server instances.
  • The sandbox connection applies to designer tests only.
  • Addresses on private networks are refused unless the operator allows them (see Overview).
  • A passphrase left in an older connection's settings is never returned.

Errors and troubleshooting ​

Message or symptomCauseFix
"a connection cannot be its own test connection"The sandbox choice equals the connection.Choose another connection.
"the test connection "X" does not exist"The sandbox code was deleted.Choose an existing connection.
"this connection does not use OAuth 2"Token status or refresh on another auth type.Use an OAuth 2 connection.
Could not get a token: ...The token address refused the client.Check client id, secret, scope and request format; then Get a new token now.
The credentials were rejected (HTTP 401)Secret expired or wrong.Edit the connection and enter the new secret.
The address points to a private or internal networkHost resolves to a private range.Use a public address, or ask the operator to allow private endpoints.

LDAP / SSO ​

The screen is titled SSO Providers. It manages OpenID Connect sign-in providers, the role mapping from a provider's group values to platform roles, and SCIM provisioning for the tenant. LDAP directory accounts are configured on the External Connectors screen, tab LDAP: see External Connectors. Per the integration contract note, an LDAP account can test the service bind, find users and verify a password, but it is not wired into the login page in this release.

Where to find it ​

Studio Explorer > Workspace > Integrations > LDAP / SSO. Page key sso-providers.

Key concepts ​

TermMeaning
ProviderOne configured OpenID Connect identity provider (Microsoft Entra ID, Google, Okta, Auth0, Keycloak, OneLogin, Ping Identity, Amazon Cognito, Oracle IAM, SAP Cloud Identity or any generic OIDC provider).
Issuer addressThe provider's OpenID address. Find endpoints reads its discovery document and fills the sign-in, token and user-info endpoints.
Redirect addressThe address the provider sends the browser back to, <origin>/api/v1/auth/sso/<id>/callback. Register it in the provider.
Role mappingExternal group or claim value to platform role. With no mapping the claim value is used as the role name.
SCIMA standard API at /scim/v2/Users and /scim/v2/Groups that lets an HR or identity system push user and group changes.

Add a sign-in provider (three steps) ​

Step 1, choose the provider. Step 2, set it up. Step 3, a confirmation with the redirect address.

FieldTypeDefaultRequiredDescription
Name shown on the sign-in buttontext"Sign in with PROVIDER"Yes
Issuer addresstextemptyYes for every provider except Microsoft and GoogleEach provider shows an example, such as https://your-company.okta.com, https://keycloak.example.com/realms/your-realm or https://cognito-idp.REGION.amazonaws.com/POOL-ID.
Authorization endpoint, Token endpoint, User info endpointtextfilled by Find endpointsOnly for "Other (OpenID Connect)" when the provider has no discovery documentOpened with "My provider has no discovery document: enter endpoints by hand". All three are then required.
Client IDtextemptyYes
Client secretpasswordemptyYesHas a show and hide toggle. Stored write-only.
Scopestextopenid email profileNoUnder "Show optional settings".
Role or group claimtextgroups for Microsoft, Okta, KeycloakNoThe claim that carries the person's groups.
Email domainstextemptyNoComma-separated. People with these domains are sent to this provider automatically.

Save provider is enabled when a provider is chosen, the name, client id and client secret are present, and endpoints are known (discovered or entered). The discovery failure message is shown as a warning. After saving, the dialog shows the redirect address with a copy button and the instruction "Turn the provider on" with the switch in the list.

Grid and row panel ​

Columns: Provider (name and client ID), Type, Email domains, Status (enabled or disabled). Each row has an enable switch and a delete button. Expanding a row shows the redirect address (read only, with copy), Preview sign-in address (the address the sign-in would redirect to, to check set-up), and the Role Mapping editor: two fields "External value (e.g. ERP-Managers)" and "SparkERP role (e.g. Manager)" and Add mapping. A disabled provider genuinely refuses sign-in.

SCIM Provisioning panel ​

A switch for Enabled or Disabled, a chip "Token issued" or "No token yet", and Generate bearer token or Regenerate bearer token. The token is shown once ("Copy this now - it will not be shown again"); regenerating invalidates the old one.

Procedure: add Okta ​

  1. Select Add provider and Okta.
  2. Keep the name "Sign in with Okta". Enter the issuer https://acme.okta.com/oauth2/default and select Find endpoints. A green panel lists the sign-in, token and user-info endpoints.
  3. Enter Client ID and Client secret. Open the optional settings and set Email domains to acme.com.
  4. Select Save provider. Copy the redirect address into the Okta application.
  5. Turn the provider on with the switch. Expand the row and add a mapping ERP-Managers to Manager.

Permissions ​

Creating, discovering, enabling, disabling and deleting providers, writing role mappings and changing SCIM settings require the authoring capability AUTHOR on the artifact type sso-provider. Listing providers, reading role mappings and previewing the sign-in address do not check a permission. Without the capability the call returns 403.

API and CLI ​

PurposeRequest
DiscoverPOST /api/v1/sso-providers/discover with {"issuer":"..."}
List, getGET /api/v1/sso-providers, GET /api/v1/sso-providers/{id} (secrets redacted)
CreatePOST /api/v1/sso-providers with providerType, displayName, issuer, clientId, clientSecret, redirectBaseUrl, optional scopes, roleClaim, emailDomains, endpoints
Enable, disablePUT /api/v1/sso-providers/{id}/enable, .../disable
DeleteDELETE /api/v1/sso-providers/{id}
PreviewGET /api/v1/sso-providers/{id}/preview-authorization-url
Role mappingsGET/POST /api/v1/sso-providers/{id}/role-mappings (externalValue, internalRole), DELETE /api/v1/sso-providers/role-mappings/{mappingId}
SCIMGET /api/v1/scim-config, PUT .../enable, PUT .../disable, POST .../regenerate-token
PublicPOST /api/v1/auth/sso/discover (email discovery), GET /api/v1/auth/sso/{id}/start, GET /api/v1/auth/sso/{id}/callback, GET /api/v1/auth/sso/providers (secret-free list)

Provider types accepted by the API: MICROSOFT, GOOGLE, OKTA, AUTH0, KEYCLOAK, ONELOGIN, PING_IDENTITY, AMAZON_COGNITO, ORACLE_IAM, SAP_CLOUD_IDENTITY, GENERIC_OIDC (the default). There is no erp command for SSO providers.

json
{
  "providerType": "OKTA",
  "displayName": "Sign in with Okta",
  "issuer": "https://acme.okta.com/oauth2/default",
  "clientId": "0oa1b2c3d4",
  "clientSecret": "replace-me",
  "redirectBaseUrl": "https://erp.acme.example",
  "scopes": "openid email profile groups",
  "roleClaim": "groups",
  "emailDomains": "acme.com"
}

Errors and troubleshooting ​

Message or symptomCauseFix
"authorizationEndpoint is required for this provider type (no fixed default exists)" (also tokenEndpoint, userinfoEndpoint)A generic provider saved without endpoints.Use Find endpoints or enter all three by hand.
A discovery warning under the issuer fieldThe issuer address is wrong or publishes no discovery document.Check the address (Okta custom servers need /oauth2/NAME); for a generic provider enter endpoints by hand.
Sign-in refused for a saved providerThe provider is disabled.Turn on the switch.
The person signs in with no rolesNo role mapping and the claim value is not a role name.Add role mappings.

Overview, Connectors, Queues, Connect to another system.