Documentation
Every change in Veltrix is attributable to a person or an API key, so who can sign in — and what they can do once they have — is platform-level machinery, not an afterthought. The Access Control area of the portal brings it together in three tabs:
Create, edit, and remove the people in your organization; assign each a role. Users can hold local credentials or be pinned to a single sign-on provider.
Fine-grained, resource-by-action permissions across the change lifecycle, including per-app permissions declared by installed integrations.
Wire sign-in to your existing IdP — AWS Cognito, Google, Microsoft Entra ID, or any OIDC-conformant provider — with per-organization overrides and controlled user provisioning.
Local email + password sign-in works on every plan. Access management — custom roles and identity provider configuration — is available on paid plans; see Pricing.
Roles are collections of resource : action permissions (for example configuration-canvas:write,
credential:read, or apiKey:write). The role catalog is live: it always reflects the
platform's enforced resources plus the permissions each installed app declares, so a role can grant app-scoped
rights as precisely as platform ones.
Veltrix ships four production single sign-on integrations. Each is configured entirely from the portal (Access Control → Identity Provider) and takes effect immediately — configuration is read per-request, so there is no server restart or cache to wait out.
| Provider | Protocol | Notes |
|---|---|---|
| AWS Cognito | OIDC (Hosted UI) | Sign-in via your user pool's Hosted UI. Optional AWS credentials let Veltrix manage pool users from the portal (create/delete), with an environment-variable fallback. |
| OAuth 2.0 / OIDC | Google Workspace or consumer Google accounts via a standard OAuth 2.0 web client. | |
| Microsoft Entra ID (Azure AD) | OAuth 2.0 / OIDC | Single-tenant or multi-tenant app registrations (common, a tenant GUID, or a verified domain). |
| Generic OIDC | OpenID Connect | Bring your own issuer: works with any OIDC-conformant provider — Okta, Auth0, Keycloak, PingFederate, and others — via standard discovery and JWKS verification. |
| SAML | SAML 2.0 | Coming soon. SAML-only IdPs that also expose an OIDC interface can use the Generic OIDC provider today. |
Local email + password authentication stays available alongside SSO — each user record carries its own authentication provider, so a mixed organization (some local accounts, some SSO) works without special setup.
All providers follow the same shape: register an application with the IdP, allow the Veltrix redirect URI, and
paste the client credentials into the provider's card. The portal pre-fills the redirect URIs for your own host —
the values below use <your-veltrix-host> as a placeholder.
Every provider is a confidential client. Veltrix redeems the authorization code
server-side using the client secret, so register a web / server-side application — never a
single-page or public client. This is the most common setup mistake, and each provider reports it
differently (Microsoft returns AADSTS9002327).
https://<your-veltrix-host>/oauth/callback.{issuer}/.well-known/openid-configuration for discovery, so the issuer must serve a discovery document.openid email profile. The ID token must carry an email claim — that is what matches an existing account or drives provisioning.https://<your-veltrix-host>/oauth/callback to the authorized redirect URIs. No authorized JavaScript origin is needed — the browser never calls Google directly.openid, email, and profile. No Google API needs enabling — sign-in verifies the ID token rather than calling an API.https://<your-veltrix-host>/oauth/callback under platform Web — not Single-page application, which rejects the server-side code exchange with AADSTS9002327. Create a client secret under Certificates & secrets.openid, email, profile, User.Read. This provider reads your profile from Graph /me, so User.Read is required. No application permissions and no .All scopes are needed — Veltrix never reads your directory.common for multi-tenant sign-in, or your directory's GUID / verified domain to restrict sign-in to one tenant.<region>_<id> (e.g. us-east-1_abcd1234).https://<your-veltrix-host>/auth/cognito/callback and the sign-out URL https://<your-veltrix-host>. Note this provider's callback path differs from the others.phone openid email.your-app.auth.us-east-1.amazoncognito.com, with no https:// and no path. Sign-in cannot work until the Hosted UI is configured on the pool.{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"cognito-idp:ListUsers",
"cognito-idp:AdminCreateUser",
"cognito-idp:AdminSetUserPassword",
"cognito-idp:AdminDeleteUser"
],
"Resource": "arn:aws:cognito-idp:<region>:<account-id>:userpool/<user-pool-id>"
}]
}
Every provider can be saved at one of two scopes, chosen per save with the Configuration scope selector:
Reset to Global Settings deletes only your organization's override and returns you to the shared default. Saving is change-aware: only providers you actually edited are written, disabling a provider is persisted rather than silently discarded, and a failure is reported per provider with the server's actual reason.
Turning a provider off at organization scope removes your override rather than blocking the provider outright — if a global default is enabled, sign-in falls back to it. To stop a provider entirely on a self-hosted instance, disable it at global scope too.
What happens when someone your IdP vouches for signs in but has no Veltrix account yet? Each provider configuration carries its own answer — the New user provisioning (JIT) mode:
| Mode | Behavior |
|---|---|
| Match email domain default | The domain of the email your identity provider asserts is matched to an organization's registered domain (e.g. alice@acme.com → Acme) and the user is created there with the organization's default User role. An unrecognized domain is rejected with a clear message — never silently dropped into another organization. |
| Do not auto-create | Only users who already exist in Veltrix can sign in through this provider. New identities are rejected and told to contact their administrator — pair with pre-provisioning for a fully admin-controlled roster. |
| First active organization legacy | Every first-time sign-in lands in the first active organization. Kept only for configurations that historically relied on it; not recommended on multi-tenant instances. |
Returning users are matched by their provider account ID or email address, so an existing local account with the same email simply gains SSO — no duplicate is created.
Admins can create users ahead of their first sign-in, pinned to an authentication provider
(LOCAL, COGNITO,
GOOGLE, AZURE, or
OIDC) via User Management or
POST /api/users:
Deactivated user or suspended organization? SSO enforces exactly the same gates as local login — a deactivated account or an inactive organization is rejected even with a perfectly valid IdP token.
Each provider's Configure dialog has a Test connection button that validates the values currently in the form — before anything is saved — and reports truthful, specific results:
| Symptom | Likely cause & fix |
|---|---|
| "No organization is configured for the domain …" | JIT is in domain-match mode and the user's email domain isn't registered to any organization. Register the domain on the organization, or pre-provision the user. |
| "Your account has not been provisioned for single sign-on" | JIT is disabled for this provider and no matching account exists. Create the user first (see pre-provisioning). |
| "This sign-in link has expired or was already used" | The one-time login state/nonce was replayed or timed out (10-minute window). Start the sign-in again from the login page. |
| "… sign-in is not configured or is disabled" | The provider is disabled at the scope this login resolves to. Check both your organization's override and the global default. |
| "Your account has been deactivated" / "Your organization's account is not active" | The same account gates as local login. An administrator must reactivate the user; a suspended organization must be restored first. |
| Test Connection: "rejected the Client ID / Client Secret pair" | The IdP is reachable but refused the credentials — re-copy both values, and if the secret was rotated at the IdP, use Replace secret and save. |