Skip to content
Data Apps

Authentication

Control who can open your Keboola app: a shared password, single sign-on with Google, Microsoft Entra ID, Okta or Auth0, or GitHub, GitLab and JumpCloud accounts.

Once an app is deployed, its URL is publicly available. Protect it so only the right people can open it, and choose the method that fits your audience. You set it in the app’s configuration under Authentication → Authentication Type, which offers six options.

The Authentication Type dropdown in an app's configuration, listing None, Basic, OIDC, GitLab, GitHub, and JumpCloud

  • None (Public Access)the app is public to anyone with the URL. You can still add your own authorization inside the app; for Streamlit, use the Streamlit authenticator (example).
  • Basic (Password)the default for new apps. Keboola generates a shared password; users enter it before the app opens. Once the app is deployed, the password is shown on the app’s configuration page next to Open App, ready to copy — and when Kai builds an app, it shows the password as the last step.
  • OIDC (Custom)users sign in with your identity provider (Google, Microsoft Entra ID, Okta, Auth0, or any other OIDC provider). Recommended for anything beyond a quick share.
  • GitHubrestrict access with GitHub OAuth by organization, team, repository, or allowed users.
  • GitLabrestrict access with GitLab OAuth by groups, projects, or roles.
  • JumpCloudrestrict access with JumpCloud OIDC, with optional role-based filtering.

OIDC lets users log into your app through your single sign-on (SSO) provider. Keboola has ready-made provider options for Google (Google SSO), Microsoft Entra ID (Azure OIDC), Okta, and Auth0, plus Generic OIDC for any other OpenID Connect provider. Users sign in with the provider you configured; if an app has more than one provider, they first pick an Authentication Provider.

The app's sign-in page asking the user to select an authentication provider, one button per configured provider

The flow is the same everywhere: open the app in Keboola, register it with your provider using the app’s callback URL, paste the provider’s credentials into the app’s Authentication settings, and deploy. Expect about 15 minutes of clicking in two browser tabs, and longer the first time in a Google Cloud project that has no consent screen yet. It needs admin rights in the provider’s console: for Google, the Owner or OAuth Config Editor role on a Google Cloud project; for the others, the right to register applications in your tenant. Kai and kbagent can’t do this part for you.

Step 1 — Open the app and copy its callback URL

Section titled “Step 1 — Open the app and copy its callback URL”

Your provider needs the app’s callback URL, so start in Keboola.

  1. In your Keboola project, open Apps and click the app. It doesn’t matter whether Kai built it or you created it yourself. No app yet? Create one manually first; it opens on its configuration page.

  2. Under Authentication, find the read-only Callback URL field and click its copy button. That is the exact value your provider needs. It appears for OIDC, GitHub, GitLab and JumpCloud, and not for None or Basic, which need no callback.

    No such field? Build the URL yourself from the App URL block on the Overview tab. That block shows the app’s host as a URL prefix plus a generated part, for example toy-store-sales and -74016144.hub.europe-west3.gcp.keboola.com, and its copy button gives you the app’s URL rather than the callback URL. Add /_proxy/callback to the end:

    https://<url-prefix>-<app-id>.hub.<stack-host>/_proxy/callback

    For example: https://toy-store-sales-74016144.hub.europe-west3.gcp.keboola.com/_proxy/callback

    An app created without a URL prefix has no hyphenated part, so its callback URL is https://<app-id>.hub.<stack-host>/_proxy/callback.

    Either way, the value exists from the moment the app does; you don’t have to deploy first.

The block sits below Authentication:

The app's Overview tab: Description, Authentication, and Git Repository cards, then the App URL block, with the App Info panel on the right

Keep this tab open. You now have the callback URL; each app has its own, so register every app with your provider separately.

Pick your provider:

Let people sign in with their Google account.

Before you start. The OAuth client lives in a Google Cloud project, not in the Google Workspace admin console, so you need a project where you can manage the consent screen and OAuth clients: the Owner role, or the OAuth Config Editor role. Decide who should get in, too. With the sign-in scopes Keboola requests (openid, email, profile), an Internal audience limits sign-in to your Google Workspace organization (the project must belong to that organization), and an External audience lets in anyone with a Google account.

Set up the consent screen. Google keeps it under Google Auth Platform; open it directly at console.cloud.google.com/auth/overview and pick your project.

  1. If the page says Google Auth Platform not configured yet and offers Get started, the project has no consent screen yet. Click it and fill in the wizard: App name and User support email, the Audience (Internal or External, see above), a contact email, then tick the User Data Policy box and click Create. If the page shows your app’s details instead, the consent screen already exists; carry on. (Branding, Audience and Clients sit in the left menu either way, so they don’t tell you which case you’re in.)

  2. Optional: open Branding and add keboola.com under Authorized domains. Google adds it for you when you save the redirect URI in the next step (“The domains of the URIs you add below will be automatically added to your OAuth consent screen as authorized domains”), so this is only worth doing if you want it in place beforehand.

  3. Check Audience. An Internal app shows only its user type; an External one also shows Publishing status, an OAuth user cap and a Test users list. Ignore all three. Google’s own text there says that while the status is Testing “only test users are able to access the app”, and that is not true for a Keboola app: the proxy asks for the openid, email and profile scopes only, and Google exempts exactly that set from the test-user rule, so an External app lets any Google account in whether or not you publish it. Publishing only matters if you want your app name and logo shown on the consent screen, and then Google asks for branding details and a verification review.

  4. Know what the audience buys you: it is the only access control Google SSO offers here. Anyone in the audience you chose can open the app — there is no group or user filter, and Keboola takes only a Client ID and secret for this provider. To narrow it further, use Microsoft Entra ID or Okta, which do have assignment, or check the signed-in user inside the app itself.

You now have: a consent screen with keboola.com authorized and the audience you want.

Create the OAuth client:

  1. Open Clients and click Create client.
  2. Set Application type to Web application and give the client a name, for example Keboola app - Toy store sales.
  3. Under Authorized redirect URIs, click Add URI and paste the callback URL from step 1, for example https://toy-store-sales-74016144.hub.europe-west3.gcp.keboola.com/_proxy/callback. It has to match exactly: https, the full host, /_proxy/callback, no trailing slash, no stray spaces.
  4. Click Create. Copy the Client ID and the Client secret now; Google shows the secret only at creation. If you lose it, open the client and click Add Secret.

You now have: a Client ID and a Client secret.

Back in Keboola. On the app’s configuration page, under Authentication, set Authentication Type to OIDC (Custom), select Google SSO in the Provider dropdown, paste the Client ID and Client secret (this option has no issuer field), and click Save. After saving, the secret field is masked. Reveal it with the eye icon and you’ll see an encrypted value starting with KBC::ProjectSecure rather than what you pasted. That is your secret stored encrypted, not a replacement; the rest of the prefix depends on which cloud your stack runs on. To change it later, paste a new value over it.

If sign-in fails:

  • Access blocked: This app’s request is invalid, with Error 400: redirect_uri_mismatch — the URI in the OAuth client differs from the app’s callback URL. Open Request details on that page: it shows the redirect_uri Google received. Compare it with the App URL block character by character (a stray space or a missing character is the usual cause) and fix the client.
  • Someone outside your organization can’t sign in — expected with the Internal audience. Switch to External on the Audience page if that’s not what you want.
  • Someone outside your organization can sign in — the audience is External. For the scopes Keboola uses, Google doesn’t limit an External app to its test users, even in Testing. Switch to Internal.
  • invalid_client, or a token error right after signing in — the Client ID or Client secret in Keboola doesn’t match the OAuth client. Paste them again, or add a new secret in Google Cloud and update the app.

Changed the redirect URI or the audience on Google’s side later? No redeploy needed; Google says such changes take from a few minutes to a few hours to apply. Console steps walked through on 2026-09-22.

  1. A new app: set its code source and click Deploy App; the short wizard asks for the backend version, the backend size and an inactivity timeout (details: Create an app manually). Just testing sign-in? A Streamlit app with a one-line inline script is the quickest thing to deploy. An app that’s already running needs Redeploy App for the new authentication to take effect; a stopped one, Start App.

  2. When the status turns Active, click Open App. Your provider asks you to sign in and, the first time, to allow the app to see your name and email address; then it sends you into the app. If the page still says the app is stopped right after a deploy, reload it — the status catches up a moment later.

  3. Test with the accounts that matter: one that should get in, one that shouldn’t. Once you’re in, the app’s own session cookie keeps you signed in, so a second try in the same window proves nothing — use a fresh private window, or open https://<your-app-url>/_proxy/sign_out to end the app session and start over.

    Know what a correct rejection looks like before you read it as a fault. With Google and an Internal audience, an account from outside your organization is stopped by Google with a message that the app is restricted to its organization — that is the app working. Do not switch the audience to External to make that message go away; it opens the app to every Google account there is. The reverse is the quiet failure: if an outside account lands in the app, your audience is External and the app is public to anyone signed in to Google.

ProviderKeboola provider optionWhat you enter besides Client ID and Client secret
Google CloudGoogle SSONothing; the issuer https://accounts.google.com is preset
Microsoft Entra IDAzure OIDCTenant ID; Keboola derives the issuer https://login.microsoftonline.com/<tenant ID>/v2.0
OktaOktaDomain/Org URL: https://<yourOktaDomain>/oauth2/default
Auth0Auth0Issuer URL: https://<yourAuth0Domain>/
Any otherGeneric OIDCIssuer URL from the provider; Logout URL optional

<yourOktaDomain> and <yourAuth0Domain> are your tenant hosts, for example acme.okta.com or acme.us.auth0.com.

Restrict access to your app using GitHub OAuth. Users authenticate via their GitHub account, and you can optionally restrict access to specific organizations, teams, repositories, or individual users.

FieldDescriptionExample
Client IDClient ID from GitHub Developer Settings > OAuth Apps.Ov23liABCDEF123456
Client SecretClient Secret from the same GitHub OAuth App.(paste your GitHub secret)
FieldDescriptionExample
GitHub URLYour GitHub Enterprise Server URL. Leave empty for public GitHub.https://github.com
OrganizationURL slug of your GitHub organization. Restricts access to organization members.my-company
TeamURL slug of the team within the organization. Requires Organization to be set.data-engineers
RepositoryRestrict to repository collaborators. Format: owner/repo-name.my-company/analytics
Access TokenRequired for private org/team/repo restrictions. Needs read:org scope. Generate at GitHub > Settings > Developer Settings > Personal Access Tokens.ghp_...
Allowed UsersComma-separated GitHub usernames. If set, only these users can log in.jane-smith, john-doe
  1. Go to your GitHub account Settings > Developer Settings > OAuth Apps and create a new OAuth App.
  2. Set the Authorization callback URL to the app’s callback URL. Copy it from the Callback URL field under Authentication, or build it as https://<url-prefix>-<app-id>.hub.<stack-host>/_proxy/callback (e.g., https://my-app-12345678.hub.north-europe.azure.keboola.com/_proxy/callback).
  3. Copy the Client ID and Client Secret from the created OAuth App.
  4. In your Keboola app configuration, select GitHub as the authentication method.
  5. Paste the Client ID and Client Secret.
  6. Optionally configure organization, team, repository, or allowed users restrictions.
  7. If you use organization, team, or repository restrictions with a private organization, provide an Access Token with read:org scope.
  8. Save and redeploy your app.

Restrict access to your app using GitLab OAuth. Users authenticate via their GitLab account, and you can optionally restrict access by groups, projects, or roles.

FieldDescriptionExample
Client IDApplication ID from GitLab > Settings > Applications.a1b2c3d4e5f6...
Client SecretApplication secret from the same GitLab application.gloas-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
GitLab Instance URLUse https://gitlab.com for public GitLab, or your self-hosted URL.https://gitlab.com
FieldDescriptionExample
GroupsOnly members of these groups can access the app. Use the URL path, not the display name. Separate multiple groups with commas.my-org/data-team
ProjectsRestrict access to members of these projects. Format: namespace/project-slug.my-org/analytics-app
Allowed RolesLeave empty to allow any role. Valid values: guest, reporter, developer, maintainer, owner.developer, maintainer
  1. Go to your GitLab instance Settings > Applications and create a new application.
  2. Set the Redirect URI to the app’s callback URL. Copy it from the Callback URL field under Authentication, or build it as https://<url-prefix>-<app-id>.hub.<stack-host>/_proxy/callback (e.g., https://my-app-12345678.hub.north-europe.azure.keboola.com/_proxy/callback).
  3. Ensure the openid, profile, and email scopes are selected. If you use group or project restrictions, also select read_api.
  4. Copy the Application ID and Secret.
  5. In your Keboola app configuration, select GitLab as the authentication method.
  6. Paste the Client ID, Client Secret, and GitLab Instance URL.
  7. Optionally configure groups, projects, or allowed roles restrictions.
  8. Save and redeploy your app.

Restrict access to your app using JumpCloud OIDC. Users authenticate via their JumpCloud account, and you can optionally restrict access by roles.

FieldDescriptionExample
Client IDClient ID from JumpCloud Admin Console > SSO > your app.6507c80f5f2b490a...
Client SecretClient Secret from JumpCloud Admin Console > SSO > your app > SSO tab. Treat like a password.(paste your JumpCloud secret)
Issuer URLPre-filled. For custom tenants, ask your JumpCloud admin for the correct issuer URL.https://oauth.id.jumpcloud.com/
Logout URLPre-filled. Change only if your JumpCloud admin provides a different logout endpoint.https://oauth.id.jumpcloud.com/oauth2/sessions/logout
FieldDescriptionExample
Allowed RolesRole values must match exactly what is set in JumpCloud’s attribute mapping. Leave empty to allow any authenticated user.data-analyst, admin
  1. In the JumpCloud Admin Console, go to SSO and create a new application (or use an existing one).
  2. Configure the application as an OIDC application.
  3. Set the Redirect URI to the app’s callback URL. Copy it from the Callback URL field under Authentication, or build it as https://<url-prefix>-<app-id>.hub.<stack-host>/_proxy/callback (e.g., https://my-app-12345678.hub.north-europe.azure.keboola.com/_proxy/callback).
  4. Copy the Client ID and Client Secret from the SSO tab.
  5. In your Keboola app configuration, select JumpCloud as the authentication method.
  6. Paste the Client ID, Client Secret, Issuer URL, and Logout URL.
  7. Optionally configure allowed roles to restrict access.
  8. Save and redeploy your app.

Every method that uses OAuth or OIDC needs a callback URL, and the app’s configuration gives you the finished value: the Callback URL field under Authentication, with a copy button. Copy it rather than typing it. A single wrong character is the most common reason sign-in fails, and the provider reports it as a redirect mismatch rather than as a typo.

The rest of this section is for reading a URL you already have, or for a stack where the field hasn’t appeared yet.

https://<url-prefix>-<app-id>.hub.<stack-host>/_proxy/callback

For example: https://my-app-12345678.hub.north-europe.azure.keboola.com/_proxy/callback

<url-prefix>-<app-id>.hub.<stack-host> is the whole host shown in the App URL block on the app’s configuration page: the URL prefix, a hyphen, and the App ID, for example toy-store-sales-74016144. An app created without a URL prefix has no hyphenated part, so its callback URL is https://<app-id>.hub.<stack-host>/_proxy/callback.


Next: Publish and share →

Ask Kai

Hi, I'm Kai — Keboola's AI assistant for the docs. Ask me anything and I'll answer from the documentation and cite the pages I use.

Kai is an AI and can make mistakes. Check the sources it links.