Kittl · Authentication Profile

Kittl Authentication

Authentication

Kittl secures its APIs with jwt, oauth2-client, and interactive-device-login across 3 declared security schemes, as derived from its OpenAPI definitions. OAuth 2.0 is offered via the authorizationCode flow(s).

CompanyDesignGraphic DesignCreative ToolsSDKDeveloper PlatformExtensionsPrint On DemandE-CommerceAIMockupsTypography
Methods: jwt, oauth2-client, interactive-device-login Schemes: 3 OAuth flows: authorizationCode API key in:

Security Schemes

cli-session interactive-device-login
kittl-user-token jwt
oauth-providers oauth2
· flows: authorizationCode

Source

Authentication Profile

kittl-authentication.yml Raw ↑
generated: '2026-07-19'
method: searched
source: https://sdk-docs.kittl.dev/Guides/Advanced/authentication
docs: https://sdk-docs.kittl.dev/Guides/Advanced/authentication
notes: >-
  Derived mechanically-by-script is not possible here — Kittl publishes no OpenAPI, so
  0-working/derive-authentication.py has no securitySchemes to read. This profile is
  searched from the published SDK documentation instead. Kittl's app platform has three
  distinct authentication surfaces, captured separately below: (1) CLI developer login,
  (2) an app-to-backend user identity token, and (3) an OAuth *client* helper that lets a
  sandboxed app authenticate against a third-party provider without exposing secrets in
  the browser. Kittl does not operate a public OAuth authorization server of its own and
  publishes no /.well-known/openid-configuration or /.well-known/oauth-authorization-server.
summary:
  types:
  - jwt
  - oauth2-client
  - interactive-device-login
  api_key_in: []
  oauth2_flows:
  - authorizationCode
  oauth2_role: client-only
  authorization_server_published: false
schemes:
- name: cli-session
  surface: Kittl CLI
  type: interactive-device-login
  description: >-
    `kittl auth login` signs a developer in. It attempts to open a browser and also
    prints a URL plus a short code that can be completed on another device.
  human_required: true
  non_interactive_supported: false
  non_interactive_note: >-
    Token-based non-interactive auth (--non-interactive for login) is documented as not
    yet supported, so unattended CI publishing is not currently possible.
  source: https://sdk-docs.kittl.dev/getting-started/kittl-cli
- name: kittl-user-token
  surface: App frontend to app backend
  type: jwt
  description: >-
    The app frontend obtains a short-lived Kittl user JWT via
    `kittl.auth.getUserToken()` and sends it to the app's own backend, which verifies it
    with @kittl/sdk-backend.
  verification:
    package: '@kittl/sdk-backend'
    method: KittlSDK.verifyUserToken(token)
    audience: appId
    audience_note: >-
      appId is used as the JWT audience, so tokens issued for a different app are
      rejected.
    subject: >-
      The verified token's `sub` claim is a pseudonymous per-app user ID — it is not a
      stable cross-app Kittl user identifier.
    error: TokenInvalidError (return 401 Unauthorized)
    signing_key_cache:
      default: in-memory per SDK instance
      default_max_age_ms: 3600000
      default_max_entries: 5
      pluggable: true
      pluggable_note: >-
        A persistent SigningKeyCache can be supplied to reuse keys across restarts and
        cold starts on edge/serverless backends.
  source: https://sdk-docs.kittl.dev/getting-started/sdk-backend
- name: oauth-providers
  surface: Sandboxed app to third-party provider
  type: oauth2
  role: client
  description: >-
    An app declares third-party OAuth providers in manifest.json under
    `config.oauthProviders` and runs the flow through `kittl.auth`, so provider secrets
    are never exposed in the sandboxed client.
  flows:
  - flow: authorizationCode
    pkce_supported: true
    pkce_note: >-
      Pass generatePKCE: true to kittl.auth.startAuth; recommended when the provider
      supports OAuth 2.1 / PKCE.
    authorizationUrl: declared per provider in manifest.json (config.oauthProviders.<id>.authorizationUrl)
    tokenUrl: declared per provider in manifest.json (config.oauthProviders.<id>.tokenUrl)
  redirect_uri: https://app.kittl.com/auth/callback/:appId
  redirect_uri_note: ':appId is the app''s ID; this must be registered as the callback with the provider.'
  manifest_fields:
  - clientId
  - scope
  - authorizationUrl
  - tokenUrl
  - accessType
  - customFieldMappings
  methods:
  - method: kittl.auth.startAuth
    purpose: Begin the flow; returns an authorization code (and code_verifier with PKCE).
  - method: kittl.auth.exchangeCode
    purpose: Exchange the authorization code for the provider's token response payload.
  - method: kittl.auth.getAuthToken
    purpose: Restore a previously stored token on app reload.
  - method: kittl.auth.getUserToken
    purpose: Obtain the short-lived Kittl user JWT for app-backend verification.
authorization_model:
  type: sdk-scopes
  artifact: scopes/kittl-scopes.yml
  description: >-
    Beyond authentication, SDK call authorization is governed by the static scope set an
    app declares in manifest.json config.scopes, enforced by the editor host at call time.
security_contact: security@kittl.com
related:
- scopes/kittl-scopes.yml
- conventions/kittl-conventions.yml
- json-schema/kittl-extension-manifest-schema.json