Compare commits

..

25 Commits

Author SHA1 Message Date
Ken Sternberg
94777fd7dc Merge branch 'main' into web/main/dependency-maint-2 2026-05-12 13:09:47 -07:00
Ken Sternberg
1b03c36c86 web/maint: Move notifications into the components folder; adjust imports accordingly
# What

1.  Moves the notifications folder from elements to components: the API and Notifications drawers are API-aware. If we want to separate that out and do something unique, we can, but for now, let’s just get things where they should be.

2.  Adjusts all the imports correctly.

3.  (Minor): Mutating the array and then calling `requestUpdate()`, especially when the array is then sorted-and-reversed, doesn’t save anything over creating a new array with the new item shifted onto the head, sorted once, and then saved to the property, which triggers an update automatically.
2026-05-11 14:53:24 -07:00
Ken Sternberg
807e3b8c61 Merge branch 'main' into dev
* main: (47 commits)
  core: bump python-kadmin-rs from 0.7.1 to 0.7.2 (#22234)
  website: bump react-dom from 19.2.5 to 19.2.6 in /website (#22198)
  web: bump the react group across 1 directory with 2 updates (#22208)
  web: bump knip from 6.9.0 to 6.11.0 in /web (#22212)
  web: bump @formatjs/intl-listformat from 8.3.4 to 8.3.5 in /web (#22211)
  website: bump react from 19.2.5 to 19.2.6 in /website (#22199)
  core: update psycopg[pool] requirement from <4,>=3 to >=3.3.4,<4 (#22201)
  core: bump the uv group across 1 directory with 2 updates (#22237)
  ci: fix make gen in release workflows (#22235)
  ci: run make gen when tagging a new release (#22229)
  ci: Improve branch-off action description (#22188)
  web/admin: fix user wizard close button (#22222)
  core: bump pydantic from 2.13.3 to 2.13.4 (#22207)
  core: bump tokio from 1.52.1 to 1.52.2 (#22160)
  core: bump library/node from `735dd68` to `4f2b45e` in /lifecycle/container (#22210)
  core, web: update translations (#22140)
  core: bump twilio from 9.10.5 to 9.10.9 (#22202)
  core: bump python-kadmin-rs from 0.7.0 to 0.7.1 (#22205)
  core: bump cachetools from 7.0.6 to 7.1.1 (#22204)
  core: bump types-requests from 2.33.0.20260408 to 2.33.0.20260503 (#22206)
  ...
2026-05-11 14:15:08 -07:00
Ken Sternberg
b5ddfa78fa Merge branch 'main' into dev
* main: (46 commits)
  events: fix `destination_group_obj` not being nullable (#22161)
  tenants/settings: present unset flags as `False` (#22162)
  root: fix version bump sed command (#22149)
  website: Add PhotoPrism integration guide (#22146)
  website: Add PostHog integration guide (#22147)
  website/docs: update user credentials tab docs (#22143)
  website/docs: release notes for 2026.5.0 (#21997)
  website/docs: document cross-provider token introspection (#22142)
  website/docs: add Wazuh SAML signing certificate step (#22071)
  website/docs: fix frontend dev environment paths and compose override usage (#20976)
  website/integrations: Add Splunk Enterprise Integration Guide (#20765)
  website/integrations: add Anthropic integration guides (#22134)
  website/integrations: Add christiaangoossens/hass-oidc-auth to the Home Assistant integration docs (#21730)
  website/integrations: Use correct API scope for Netbird (#21780)
  website/integrations: ? (#22138)
  website/docs: add CMake to full dev environment (#22137)
  locale: fix de_DE locale placeholder (#22130)
  website/docs: stages cleanup (#21558)
  website: bump the build group in /website with 3 updates (#22104)
  web: bump basic-ftp from 5.3.0 to 5.3.1 in /web (#22131)
  ...
2026-05-08 10:02:07 -07:00
Ken Sternberg
cc9c06d975 Merge branch 'main' into dev
* main:
  root: ensure uv sync does not update uv.lock (#22084)
  core: bump dramatiq from 1.17.1 to 2.1.0 (#22076)
  web: Fix Vendored Lex package. Add Unit Tests  (#22083)
  core, web: update translations (#22074)
  website: bump the build group in /website with 6 updates (#22075)
  web: bump ip-address from 10.1.0 to 10.2.0 in /web (#22082)
  web: bump the swc group across 1 directory with 11 updates (#22078)
  ci: bump taiki-e/install-action from 2.75.29 to 2.75.30 in /.github/actions/setup (#22077)
  web: bump country-flag-icons from 1.6.16 to 1.6.17 in /web (#22079)
  web: bump yaml from 2.8.3 to 2.8.4 in /web (#22080)
  core: bump sentry from 0.47.0 to 0.48.0 (#22081)
  packages/client-ts: Fix TypeScript config, ESBuild warnings (#21863)
  web: fix identification stage OUIA attributes (#22049)
  stages/invitation: Invitation wizard (#20399)
  Web/release202604/nits 2 (#22040)
  web: Gracefully handle missing element construction. (#21787)
2026-05-06 08:24:44 -07:00
Ken Sternberg
3e966ee89b Merge branch 'main' into dev
* main: (24 commits)
  root: update django to 5.2.14 (#22064)
  tenants: add option to mark flag as deprecated (#22063)
  web/stages: better wording for webauthn authenticator attachments options (#22062)
  web: bump vite from 8.0.8 to 8.0.10 in /web (#21842)
  api: set authenticated session user agent nullable properties (#22059)
  web/admin: redirect stage: adds mention of static url (#22060)
  web: bump axios from 1.15.0 to 1.16.0 in /web (#22058)
  providers/oauth2: override RedirectURITypeEnum capitalization for generated API (#22037)
  website/docs: document language settings (#21968)
  website/docs: document supported PostgreSQL versions (#21967)
  website: bump docusaurus-theme-openapi-docs from 5.0.1 to 5.0.2 in /website (#22052)
  web: bump the storybook group across 1 directory with 5 updates (#22024)
  revert: web: Consistent use of "User Dashboard" (#22038) (#22046)
  core: bump metrics-exporter-prometheus from 0.18.1 to 0.18.3 (#22057)
  core, web: update translations (#22047)
  core: bump cryptography from 47.0.0 to 48.0.0 (#22053)
  core: bump psycopg[c,pool] from 3.3.3 to 3.3.4 (#22054)
  ci: bump taiki-e/install-action from 2.75.28 to 2.75.29 in /.github/actions/setup (#22056)
  web: remove native fieldset borders from action groups (#21334)
  website/docs: document blueprint import options (#21973)
  ...
2026-05-05 09:17:23 -07:00
Ken Sternberg
1860593069 Merge branch 'main' into dev
* main: (36 commits)
  website/integrations: actual budget: add env var  (#22036)
  website/docs: add webhook mapping examples (#21971)
  website/integrations: fix nextcloud LDAP group mapping (#21970)
  website/docs: preserve blueprint download filenames (#21969)
  web: Radio and Checkbox Input Revisions (#21792)
  providers/oauth: make rp init logout oidc certification changes (#21815)
  website/docs: document SCIM custom attributes (#21980)
  root: introduce allinone mode (#21990)
  website/docs: add SAML source mapping guidance (#21978)
  website/docs: fix misplaced AWS-LC clang warning (#22034)
  lifecycle/worker_process: fix healthchecks and metrics not reloading db connections after a failure (#21992)
  root: add more logging to worker requests (#21989)
  root/channels: use group_send_blocking where possible (#21993)
  core, web: update translations (#22014)
  translate: Updates for project authentik and language fr_FR (#22015)
  enterprise/providers/ssf: more conformance fixes (#21521)
  web/flows: update flow background (#22032)
  website/integrations: update NetBox OIDC config (#22018)
  web: bump @formatjs/intl-listformat from 8.3.2 to 8.3.4 in /web (#22026)
  web: bump knip from 6.6.3 to 6.7.0 in /web (#22027)
  ...
2026-05-04 14:15:35 -07:00
Ken Sternberg
41e6a9860b Merge branch 'main' into dev
* main:
  web/admin: use bindings form for app entitlements (#22007)
  website/integrations: Add guide to integrate Technitium DNS with authentik (#21826)
  website/docs: clarify M2M scope requests (#21977)
  website/docs: clarify LDAP TLS verification (#21974)
  website/docs: clarify blueprint identifiers (#21976)
  website/docs: document promoted sources (#21979)
  lifecycle/aws: bump aws-cdk from 2.1118.4 to 2.1119.0 in /lifecycle/aws (#22001)
  web: bump the swc group across 1 directory with 11 updates (#22004)
  core: bump uvicorn[standard] from 0.45.0 to 0.46.0 (#22002)
  web: bump @sentry/browser from 10.49.0 to 10.50.0 in /web in the sentry group across 1 directory (#22003)
  ci: bump taiki-e/install-action from 2.75.23 to 2.75.25 in /.github/actions/setup (#22005)
  core: bump reqwest from 0.13.2 to 0.13.3 (#22006)
  stages/authenticator_webauthn: Update FIDO MDS3 & Passkey aaguid blobs (#21999)
  core, web: update translations (#21998)
  enterprise: account lockdown (#18615)
  enterprise/lifecycle: remove one review per object limitation (#21046)
2026-05-01 07:43:48 -07:00
Ken Sternberg
2f5ad8600a Merge branch 'main' into dev
* main:
  web: bump knip from 6.6.0 to 6.6.3 in /web (#21981)
  packages/ak-common/tracing: make log level lowercase (#21991)
  root: only allow listen failure in dev (#21987)
  flows: preserve signed background URLs in CSS (#21868)
  core, web: update translations (#21966)
  core: fix search for app entitlements failing (#21944)
  ci: bump taiki-e/install-action from 2.75.22 to 2.75.23 in /.github/actions/setup (#21982)
  website/integrations: Refactor and cleanup GitHub Enterprise (#21685)
  web: Clear remember me before navigation. (#21647)
  web: bump knip from 6.4.1 to 6.6.0 in /web (#21957)
  core: bump github.com/getsentry/sentry-go from 0.45.1 to 0.46.0 (#21955)
  core: bump uvicorn[standard] from 0.44.0 to 0.45.0 (#21956)
  core: bump rustls from 0.23.39 to 0.23.40 (#21958)
  core: support hashed password in users API + automated install (#18686)
  core, web: update translations (#21952)
  providers/saml: generate issuer url when provider is set on app (#18022)
2026-04-30 10:42:32 -07:00
Ken Sternberg
0d0690a315 Merge branch 'main' into dev
* main: (269 commits)
  root: fix rust build with uv-installed Python (#21858)
  core: add support for hiding applications from the user dashboard (#21530)
  core: bump ruff from 0.15.11 to 0.15.12 (#21871)
  packages/ak-axum/router: add X-Powered-By to all responses (#21940)
  core: bump microsoft-kiota-serialization-form from 1.9.8 to v1.10.1 (#21909)
  core: bump pytest-randomly from 4.0.1 to 4.1.0 (#21873)
  core: users/groups reduce number of database queries (#20431)
  core: bump types-channels from 4.3.0.20260408 to 4.3.0.20260421 (#21872)
  ci: bump taiki-e/install-action from 2.75.21 to 2.75.22 in /.github/actions/setup (#21877)
  core, web: update translations (#21870)
  sources/oauth: ensure user ID is returned as str (#21880)
  translate: Updates for project authentik and language no_NO (#21862)
  core: bump maxminddb from 3.0.0 to v3.1.1 (#21907)
  core: bump prometheus-client from 0.24.0 to v0.25.0 (#21919)
  core: bump azure-identity from 1.25.1 to v1.25.3 (#21886)
  core: bump aiohttp from 3.13.4 to v3.13.5 (#21882)
  core: bump anyio from 4.12.1 to v4.13.0 (#21883)
  core: bump asgiref from 3.11.0 to v3.11.1 (#21884)
  core: bump azure-core from 1.38.0 to v1.39.0 (#21885)
  core: bump blessed from 1.25.0 to v1.38.0 (#21887)
  ...
2026-04-28 10:15:59 -07:00
Ken Sternberg
639f02a06e Merge branch 'main' into dev
* main: (36 commits)
  web/e2e: accept options in NavigatorFixture.waitForPathname (#21507)
  web/styles: switch to upstream RedHat variable fonts and brighten orange palette (#21509)
  web/styles: add ak-c-loading-skeleton CSS component (#21510)
  core, web: update translations (#21532)
  core: bump lxml from 6.0.2 to 6.0.3 (#21523)
  core: bump library/node from `45babd1` to `9707cd4` in /lifecycle/container (#21522)
  tasks: better error message for Retry exceptions (#18235)
  web/admin: fix user list avatar (#21531)
  core: bump django from v5.2.12 to 5.2.13 (#21520)
  core: add cooldown to dependabot (#21286)
  web/admin: include avatar in user list page (#21518)
  events: add index on Event.user.pk (#19576)
  ci: always run apt update (#21516)
  enterprise/search: move QL to open source] (#21484)
  core: add logging when session decode fails (#21514)
  website/docs: Refactor email configuration (#21130)
  core: bump types-ldap3 from 2.9.13.20260402 to 2.9.13.20260408 (#21493)
  packages/ak-common/db: init (#21357)
  packages/ak-axum/extract/host: init (#21323)
  web: bump knip from 6.3.0 to 6.3.1 in /web (#21505)
  ...
2026-04-10 08:28:55 -07:00
Ken Sternberg
1a5f7b06be Merge branch 'main' into dev
* main: (38 commits)
  website/integrations: update FortiGate SSLVPN doc (#21475)
  ci: cache apt install (#21480)
  packages/ak-common: use imports where possible (#21478)
  packages/ak-axum/server: cleanup unix socket (#21477)
  packages/ak-common, ak-axum: improve logging (#21476)
  packages/ak-axum/extract/scheme: init (#21322)
  core: fix policy binding objects not being nullable (#21421)
  packages/ak-axum/extract/client_ip: init (#21321)
  translate: Updates for project authentik and language fr_FR (#21474)
  website: bump the docusaurus group in /website with 10 updates (#21452)
  packages/docusaurus-config: update config for docusaurus 3.10 (#21471)
  packages/ak-axum/extract/trusted_proxy: init (#21320)
  web: Fix duplicate Turnstile widgets after extended idle (#21380)
  packages/ak-axum/accept/proxy_protocol: init (#21319)
  web: bump chromedriver from 147.0.0 to 147.0.1 in /web (#21467)
  ci: fix `docker-push-variables` (#21470)
  core, web: update translations (#21450)
  docs,ci: fix main daily compose downloads + release template (#21448)
  web: bump the storybook group across 1 directory with 5 updates (#21460)
  core: bump cryptography from 46.0.6 to 46.0.7 (#21456)
  ...
2026-04-08 14:46:44 -07:00
Ken Sternberg
118d34ae43 Merge branch 'main' into dev
* main: (58 commits)
  packages/ak-axum/error: init (#21315)
  packages/ak-axum: init (#21313)
  website: bump the build group across 1 directory with 9 updates (#21396)
  core: bump jwcrypto from 1.5.6 to 1.5.7 (#21423)
  web: bump fuse.js from 7.1.0 to 7.3.0 in /web (#21429)
  web: bump the bundler group across 1 directory with 3 updates (#21425)
  web: bump cspell from 9.7.0 to 10.0.0 (#21427)
  web: bump knip from 6.1.0 to 6.3.0 in /web (#21428)
  sources/ldap: Switch to new connection tracking, deprecated attribute-based connection (#21392)
  packages/ak-common/mode: init (#21259)
  packages/ak-common/tracing: init (#21263)
  web/admin: Improve WS-Fed algo selection logic (#20881)
  packages/ak-common/tls: init (#21262)
  packages/ak-common/config: add set helper for tests (#21356)
  tasks: allow retry for rejected tasks only (#21433)
  core, web: update translations (#21394)
  website/docs: clarify file upload troubleshooting (#21361)
  ci: bump aws-actions/configure-aws-credentials from 6.0.0 to 6.1.0 (#21424)
  core: bump uvicorn[standard] from 0.43.0 to 0.44.0 (#21422)
  ci: bump taiki-e/install-action from 2.73.0 to 2.74.0 in /.github/actions/setup (#21426)
  ...
2026-04-07 08:39:03 -07:00
Ken Sternberg
ca6fd3d700 Merge branch 'main' into dev
* main:
  website/docs: Clean up PostgreSQL documentation (#21131)
2026-04-02 13:16:29 -07:00
Ken Sternberg
380349a136 Merge branch 'main' into dev
* main: (26 commits)
  root: fix compose generation for patch releases release candidates (#21353)
  web: bump @swc/cli from 0.8.0 to 0.8.1 in /web in the swc group across 1 directory (#21300)
  providers/proxy: fix oidc client not using socket in embedded outpost (#21280)
  packages/client-rust: fix portable sed usage (#21337)
  packages/ak-common/tokio/proxy_procotol: init (#21311)
  packages/ak-common/config: init (#21256)
  core: bump beryju.io/ldap from 0.1.0 to 0.2.1 (#21235)
  web: bump @sentry/browser from 10.46.0 to 10.47.0 in /web in the sentry group across 1 directory (#21297)
  packages/ak-common/arbiter: init (#21253)
  website/docs: fix full dev setup ordering (#21332)
  core: bump types-docker from 7.1.0.20260328 to 7.1.0.20260402 (#21342)
  packages/ak-common: rename from ak-lib (#21314)
  root: fix rustfmt config (#21312)
  core: bump types-ldap3 from 2.9.13.20260319 to 2.9.13.20260402 (#21343)
  web: bump the bundler group across 1 directory with 4 updates (#21345)
  core: bump aiohttp from 3.13.3 to 3.13.4 (#21333)
  core, web: update translations (#21335)
  lifecycle/aws: bump aws-cdk from 2.1115.1 to 2.1116.0 in /lifecycle/aws (#21338)
  core: bump types-requests from 2.33.0.20260327 to 2.33.0.20260402 (#21339)
  core: bump django-stubs[compatible-mypy] from 6.0.1 to 6.0.2 (#21340)
  ...
2026-04-02 09:54:27 -07:00
Ken Sternberg
faf515e4b1 Merge branch 'main' into dev
* main:
  packages/django-postgres-cache: fix expiry and delete (#21307)
  website/docs: entra scim: add note about validator (#21273)
  core: bump djangorestframework-stubs[compatible-mypy] from 3.16.8 to 3.16.9 (#21294)
  web: bump @xmldom/xmldom from 0.8.11 to 0.8.12 in /web (#21301)
  blueprints: rework one-time import (#18074)
  lifecycle/aws: bump aws-cdk from 2.1115.0 to 2.1115.1 in /lifecycle/aws (#21293)
  core, web: update translations (#21288)
  core: bump sentry-sdk from 2.56.0 to 2.57.0 (#21295)
  core: bump aws-cdk-lib from 2.245.0 to 2.246.0 (#21296)
  stages/authenticator_webauthn: Update FIDO MDS3 & Passkey aaguid blobs (#21290)
  ci: bump getsentry/action-release from 3.5.0 to 3.6.0 (#21298)
  ci: bump taiki-e/install-action from 2.70.3 to 2.70.4 in /.github/actions/setup (#21299)
  website/docs: add example recovery flow with MFA (#19497)
  website/docs: format cache settings (#21289)
  source/saml: Add forceauthn to saml authnrequest (#20883)
2026-04-01 08:34:17 -07:00
Ken Sternberg
3d40620b8c Merge branch 'main' into dev
* main:
  translate: Updates for project authentik and language fr_FR (#21285)
  packages/django-postgres-cache: rework to use ORM (#17771)
  providers/saml: Fix redirect for saml slo (#21258)
  core: fix provider not nullable (#21275)
  website/docs: ad source: add note about ldap signing (#21274)
  website/api: update API clients doc (#21202)
  ci: bump taiki-e/install-action from 2.70.2 to 2.70.3 in /.github/actions/setup (#21267)
  lifecycle/aws: bump aws-cdk from 2.1114.1 to 2.1115.0 in /lifecycle/aws (#21265)
  core, web: update translations (#21264)
  packages/ak-lib: init (#21257)
  website/docs: document group_uuid as a property for group object (#20865)
  web/flow: extract lifecycle events peripheral to stage management into their own controllers (#20898)
  core: bump pygments from 2.19.2 to 2.20.0 (#21260)
  website/docs: add grafana dashboard (#21254)
2026-03-31 13:23:45 -07:00
Ken Sternberg
7d7e2e91f6 Merge branch 'main' into dev
* main: (52 commits)
  stages/authenticator_webauthn: save attestation certificate when creating credential (#20095)
  web/admin: fix missing icon on app view page (#21251)
  web/elements: allow table per-column options (#21250)
  ci: bump actions/setup-go from 6.3.0 to 6.4.0 (#21245)
  web: bump knip from 6.0.6 to 6.1.0 in /web (#21241)
  web: bump globby from 16.1.1 to 16.2.0 in /web (#21242)
  core: bump types-requests from 2.32.4.20260324 to 2.33.0.20260327 (#21236)
  core: bump types-docker from 7.1.0.20260322 to 7.1.0.20260328 (#21237)
  core: bump aws-cdk-lib from 2.244.0 to 2.245.0 (#21238)
  ci: bump int128/docker-manifest-create-action from 2.16.0 to 2.17.0 (#21244)
  ci: bump astral-sh/setup-uv from 7.6.0 to 8.0.0 in /.github/actions/setup (#21246)
  ci: bump taiki-e/install-action from 2.69.12 to 2.70.2 in /.github/actions/setup (#21247)
  ci: bump actions/setup-go from 6.3.0 to 6.4.0 in /.github/actions/setup (#21248)
  core, web: update translations (#21233)
  translate: Updates for project authentik and language fr_FR (#21214)
  web/admin: polish recent events, various button alignments and labels (#21232)
  outposts: Create separate metrics service in Kubernetes (#21229)
  events: fix exception in volume endpoint, adjust simple table size (#21230)
  core: Application stats, device events & cleanup (#21225)
  core: bump axllent/mailpit from v1.29.4 to v1.29.5 in /tests/e2e (#21226)
  ...
2026-03-30 10:13:12 -07:00
Ken Sternberg
631c3c788d Merge branch 'main' into dev
* main:
  website/integrations: add OAUTH_AUTO_REDIRECT for karakeep (#21180)
  website/integrations: beszel: add email scope (#21176)
  web: lint/small type errors (#21179)
  packages/django-dramatiq-postgres: add index for (queue_name, state, eta) (#21175)
  root: add git attributes for generated/vendored (#21177)
  web: bump vite from 8.0.2 to 8.0.3 in /web (#21171)
  core, web: Vendored client follow-ups (#21174)
  website: Enable gtag in production (#21151)
2026-03-26 13:31:25 -07:00
Ken Sternberg
7aa992079e Merge branch 'main' into dev
* main: (21 commits)
  root: cleanup API generation (#21172)
  packages/client-ts: init (#21120)
  core, web: update translations (#21159)
  website: bump @goauthentik/docusaurus-config from 2.5.1 to 2.6.0 in /website in the docusaurus group (#21161)
  core: bump cryptography from 46.0.5 to 46.0.6 (#21162)
  core: bump library/node from 25.8.1-trixie to 25.8.2-trixie in /website (#21163)
  ci: bump taiki-e/install-action from 2.69.9 to 2.69.10 in /.github/actions/setup (#21164)
  web: bump the goauthentik group across 1 directory with 3 updates (#21165)
  web: bump typescript from 5.9.3 to 6.0.2 in /web (#21107)
  web/flows: fix continuous flow leftovers (#21158)
  web: bump picomatch from 4.0.3 to 4.0.4 (#21157)
  web: bump yaml from 2.8.2 to 2.8.3 (#21156)
  website: bump picomatch in /website (#21155)
  web: bump smol-toml from 1.6.0 to 1.6.1 (#21154)
  web: bump picomatch from 2.3.1 to 2.3.2 in /web (#21153)
  web: bump smol-toml from 1.6.0 to 1.6.1 in /web (#21152)
  root: optimise api client generation speed (#21141)
  website/integrations: nextcloud add back-channel logout documentation (#21147)
  core: bump requests from 2.32.5 to 2.33.0 (#21146)
  web: bump chromedriver from 146.0.5 to 146.0.6 in /web (#21128)
  ...
2026-03-26 08:13:28 -07:00
Ken Sternberg
23536f9625 Merge branch 'main' into dev
* main: (26 commits)
  endpoints/connectors: fix enabled flag not respected (#21144)
  web: bump vite from 7.3.1 to 8.0.2 in /web (#21109)
  website/docs: add a single page about our user interface, document Consent stage (#20533)
  website: bump the build group across 1 directory with 9 updates (#21127)
  web: bump knip from 5.88.1 to 6.0.5 in /web (#21129)
  core: bump drf-spectacular from 0.28.0 to 0.29.0 (#19420)
  packages/client-go: init (#21139)
  providers/proxy: Add a default maxResponseBodySize to Traefik Middleware (#21111)
  core: bump library/nginx from `dec7a90` to `7150b3a` in /website (#21137)
  core: bump gunicorn from 25.1.0 to 25.2.0 (#21134)
  core: bump github.com/getsentry/sentry-go from 0.43.0 to 0.44.1 (#21122)
  core: bump astral-sh/uv from 0.11.0 to 0.11.1 in /lifecycle/container (#21135)
  ci: bump taiki-e/install-action from 2.69.8 to 2.69.9 in /.github/actions/setup (#21136)
  web/a11y: Modals, Command Palette (Merge branch) (#17812)
  website/docs: document file picker values (#20994)
  packages/client-rust: init (#21117)
  core: bump sentry-sdk from 2.55.0 to 2.56.0 (#21124)
  events: add helper to log deprecation configuration_warning message (#21115)
  core: bump djangorestframework from 3.17.0 to 3.17.1 (#21126)
  core: bump twilio from 9.10.3 to 9.10.4 (#21123)
  ...
2026-03-25 09:59:07 -07:00
Ken Sternberg
b6d8df057e Merge branch 'main' into dev
* main:
  core: remove filter_not_expired for QS (#18274)
  tenants: fix default schema in initial migration (#21114)
  core: bump django-stubs[compatible-mypy] from 5.2.9 to 6.0.1 (#21099)
  core, web: update translations (#21097)
  lifecycle/aws: bump aws-cdk from 2.1112.0 to 2.1113.0 in /lifecycle/aws (#21098)
  core: bump types-requests from 2.32.4.20260107 to 2.32.4.20260324 (#21100)
  core: bump constructs from 10.5.1 to 10.6.0 (#21101)
  core: bump astral-sh/uv from 0.10.12 to 0.11.0 in /lifecycle/container (#21103)
  ci: bump taiki-e/install-action from 2.69.6 to 2.69.7 in /.github/actions/setup (#21104)
  web: bump flatted from 3.4.1 to 3.4.2 (#21076)
  core: bump goauthentik.io/api/v3 to 3.2026.5.0-rc1-1774286095 (#21089)
  core: bump cbor2 from 5.8.0 to 5.9.0 (#21094)
  ci: fix cherry-pick action generating empty title (#21091)
  web: bump the swc group across 1 directory with 11 updates (#21070)
  web: bump yaml from 2.8.2 to 2.8.3 in /web (#21071)
  core: add flag for future default behaviour of requiring a binding to access an application (#16247)
2026-03-24 07:52:19 -07:00
Ken Sternberg
7c60c42449 Merge branch 'main' into dev
* main: (22 commits)
  ci: rotate GH App private key (#21085)
  internal/web: remove authentication for metrics (#21077)
  lib/config: explicit some defaults (#21079)
  internal: remove unix sockets on shutdown (#21081)
  ci: fix escaping in cherry-pick action (#21082)
  lib/config: support printing multiple values (#21080)
  root: fix rust setup (#21078)
  core: bump types-docker from 7.1.0.20260109 to 7.1.0.20260322 (#21062)
  policies: remove BufferedPolicyAccessView leftovers (#21057)
  core: bump axllent/mailpit from v1.29.3 to v1.29.4 in /tests/e2e (#21061)
  core: bump types-channels from 4.3.0.20250822 to 4.3.0.20260321 (#21063)
  core: bump github.com/jackc/pgx/v5 from 5.8.0 to 5.9.1 (#21059)
  translate: Updates for project authentik and language fr_FR (#21056)
  ci: bump taiki-e/install-action from 2.69.2 to 2.69.6 in /.github/actions/setup (#21068)
  web: bump the storybook group across 1 directory with 5 updates (#21031)
  web: bump knip from 5.88.0 to 5.88.1 in /web (#21033)
  web: bump type-fest from 5.4.4 to 5.5.0 in /web (#21032)
  events: prevent exception when events contains incompatible unicode (#21048)
  web/admin: handle non-string values in formatUUID to prevent Event Log crash (#20804)
  events: avoid implicitly setting context from login_failed event (#21045)
  ...
2026-03-23 09:41:37 -07:00
Ken Sternberg
00375472e7 Merge branch 'main' into dev
* main: (36 commits)
  website: fix typos (#20996)
  internal/outpost/ak: fix ws URL on outpost restart (#21041)
  sources/ldap: fix incorrect error response for invalid sync_users_password (#21016)
  website/docs: add missing dependencies for linux dev environment (#21020)
  core, web: update translations (#21021)
  web: bump flatted from 3.4.1 to 3.4.2 in /web (#21037)
  web: bump @sentry/browser from 10.44.0 to 10.45.0 in /web in the sentry group across 1 directory (#21022)
  website: bump flatted from 3.4.1 to 3.4.2 in /website (#21038)
  core: bump astral-sh/uv from 0.10.11 to 0.10.12 in /lifecycle/container (#21027)
  ci: bump actions-rust-lang/setup-rust-toolchain from 1.15.3 to 1.15.4 in /.github/actions/setup (#21030)
  ci: bump taiki-e/install-action from 2.68.26 to 2.69.2 in /.github/actions/setup (#21029)
  core: bump goauthentik/fips-debian from `7baeeaa` to `7726387` in /lifecycle/container (#21028)
  core: bump aws-cdk-lib from 2.243.0 to 2.244.0 (#21026)
  core: bump types-ldap3 from 2.9.13.20251121 to 2.9.13.20260319 (#21024)
  core: bump ruff from 0.15.6 to 0.15.7 (#21023)
  core: bump goauthentik/fips-python from `859ad57` to `bf45eb7` in /lifecycle/container (#21025)
  website/integrations: fix AWS SCIM with Identity Center (#21017)
  root: allow listening on multiple IPs (#20930)
  website: switch docs analytics to gtag (#20993)
  web: link file picker to docs (#20995)
  ...
2026-03-20 09:52:57 -07:00
Ken Sternberg
4b51838f42 ## What
window.authentik.flow = {
             "layout": "{{ flow.layout }}",
    +        "background": "{{ flow.background }}",
    +        "title": "{{ flow.title }}",
         };

Amends the `flow.html` template and `GlobalAuthentik` parser to include new parameters, `background` and `title`, in the flow-specific part of the configuration written to the HTML `<head>` object, and to provide those parameters to client code.

## Why

The `layout` is start-up critical: it tells the Flow interface how the admin wants the Flow page to look, and allows the HTML and CSS to be pre-aligned to that condition. `layout` is determined on a per-Flow bases, not a per-Stage basis; Flows are derived from a tuple of `(Brand, Application?)`, where the opening policy *may* direct a user to a different flow if the user reached authentik via a redirect from a specific application, but will otherwise fall back to the default Flow for the Brand.

The `background` is a field that is required if the `Flow`’s layout is of type `frame_background`; in this case, the part of the viewport not dedicated to the FlowExecutor is reserved for an `<iframe>` that will be filled in with whatever the administrator specifies. Although this gives it the same priority as `layout` (whether it’s provided or undefined) for describing the [chrome](https://developer.mozilla.org/en-US/docs/Glossary/Chrome) around a challenge, it is currently not provided to the application in the start-up config; it is provided in the `challenge` and renders the IFrame as part of the initial challenge.

This patch fixes that; if `layout` is provided, `background` ought to be as well, even if it’s empty. The execution of a Challenge ought not have any influence over the look and feel of the Flow-defined appearance *around* that Challenge.

I have added `title` as well; with that, all of the current theme-and-appearance related configuration details are placed into `<head>` and can be removed from the FlowExecutor.

Server-side, `background` is currently specified: `background = FileField(blank=True, default="")` which is … interesting since we also appear to store URLs in it. I don’t see anything in the FlowSerializer that would change that from a client’s point of view.

This patch furthers the effort to separate flow execution from flow presentation.

- \[🐰\] The code has been formatted (`make web`)
2026-03-18 15:25:11 -07:00
16 changed files with 187 additions and 210 deletions

File diff suppressed because one or more lines are too long

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-05-13 05:39+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -226,10 +226,6 @@ msgstr ""
msgid "The slug '{slug}' is reserved and cannot be used for applications."
msgstr ""
#: authentik/core/api/groups.py
msgid "User does not have permission to add members to this group."
msgstr ""
#: authentik/core/api/providers.py
msgid ""
"When not set all providers are returned. When set to true, only backchannel "
@@ -260,14 +256,6 @@ msgstr ""
msgid "Setting a user to internal service account is not allowed."
msgstr ""
#: authentik/core/api/users.py
msgid "User does not have permission to add members to a superuser group."
msgstr ""
#: authentik/core/api/users.py
msgid "User does not have permission to assign roles."
msgstr ""
#: authentik/core/api/users.py
msgid "Can't modify internal service account users"
msgstr ""

Binary file not shown.

View File

@@ -29,15 +29,16 @@ import { renderDialog } from "#elements/dialogs";
import { WithCapabilitiesConfig } from "#elements/mixins/capabilities";
import { WithNotifications } from "#elements/mixins/notifications";
import { canAccessAdmin, WithSession } from "#elements/mixins/session";
import { AKDrawerChangeEvent } from "#elements/notifications/events";
import { navigate } from "#elements/router/RouterOutlet";
import { SlottedTemplateResult } from "#elements/types";
import { AKDrawerChangeEvent } from "#components/notifications/events";
import {
DrawerState,
persistDrawerParams,
readDrawerParams,
renderNotificationDrawerPanel,
} from "#elements/notifications/utils";
import { navigate } from "#elements/router/RouterOutlet";
import { SlottedTemplateResult } from "#elements/types";
} from "#components/notifications/utils";
import Styles from "#admin/ak-interface-admin.css";
import { ROUTES } from "#admin/Routes";

View File

@@ -10,10 +10,10 @@ import { formatUserDisplayName } from "#common/users";
import { AKElement } from "#elements/Base";
import { WithNotifications } from "#elements/mixins/notifications";
import { WithSession } from "#elements/mixins/session";
import { AKDrawerChangeEvent } from "#elements/notifications/events";
import { isDefaultAvatar } from "#elements/utils/images";
import Styles from "#components/ak-nav-button.css";
import { AKDrawerChangeEvent } from "#components/notifications/events";
import { CoreApi } from "@goauthentik/api";

View File

@@ -5,7 +5,8 @@ import { globalAK } from "#common/global";
import { AKElement } from "#elements/Base";
import { listen } from "#elements/decorators/listen";
import { AKDrawerChangeEvent } from "#elements/notifications/events";
import { AKDrawerChangeEvent } from "#components/notifications/events";
import { msg } from "@lit/localize";
import { css, CSSResult, html, TemplateResult } from "lit";
@@ -80,14 +81,9 @@ export class APIDrawer extends AKElement {
@listen(AKRequestPostEvent, { target: window })
protected enqueueRequest = ({ requestInfo }: AKRequestPostEvent) => {
this.requests.push(requestInfo);
this.requests.sort((a, b) => a.time - b.time).reverse();
if (this.requests.length > 50) {
this.requests.shift();
}
this.requestUpdate();
this.requests = [requestInfo, ...this.requests]
.toSorted((a, b) => b.time - a.time)
.slice(0, 50);
};
render(): TemplateResult {

View File

@@ -10,10 +10,11 @@ import { formatElapsedTime } from "#common/temporal";
import { AKElement } from "#elements/Base";
import { WithNotifications } from "#elements/mixins/notifications";
import { WithSession } from "#elements/mixins/session";
import { AKDrawerChangeEvent } from "#elements/notifications/events";
import { SlottedTemplateResult } from "#elements/types";
import { ifPresent } from "#elements/utils/attributes";
import { AKDrawerChangeEvent } from "#components/notifications/events";
import { Notification } from "@goauthentik/api";
import { msg, str } from "@lit/localize";

View File

@@ -1,4 +1,4 @@
import { DrawerState, readDrawerParams } from "#elements/notifications/utils";
import { DrawerState, readDrawerParams } from "#components/notifications/utils";
/**
* Event dispatched when the state of the interface drawers changes.

View File

@@ -2,8 +2,8 @@
* @file Notification drawer utilities.
*/
import "#elements/notifications/APIDrawer";
import "#elements/notifications/NotificationDrawer";
import "#components/notifications/APIDrawer";
import "#components/notifications/NotificationDrawer";
import { getURLParam, updateURLParams } from "#elements/router/RouteMatch";

View File

@@ -13,9 +13,10 @@ import {
NotificationsMixin,
} from "#elements/mixins/notifications";
import { SessionMixin } from "#elements/mixins/session";
import { createPaginatedNotificationListFrom } from "#elements/notifications/utils";
import type { ReactiveElementHost } from "#elements/types";
import { createPaginatedNotificationListFrom } from "#components/notifications/utils";
import { EventsApi } from "@goauthentik/api";
import { ContextProvider } from "@lit/context";

View File

@@ -20,9 +20,10 @@ import {
SessionMixin,
UIConfigContext,
} from "#elements/mixins/session";
import { AKDrawerChangeEvent } from "#elements/notifications/events";
import type { ReactiveElementHost } from "#elements/types";
import { AKDrawerChangeEvent } from "#components/notifications/events";
import { CoreApi, SessionUser } from "@goauthentik/api";
import { setUser } from "@sentry/browser";

View File

@@ -4,10 +4,11 @@ import { MessageLevel } from "#common/messages";
import { ContextControllerRegistry } from "#elements/controllers/ContextControllerRegistry";
import { showMessage } from "#elements/messages/MessageContainer";
import { AKDrawerChangeEvent } from "#elements/notifications/events";
import { createPaginatedNotificationListFrom } from "#elements/notifications/utils";
import { createMixin } from "#elements/types";
import { AKDrawerChangeEvent } from "#components/notifications/events";
import { createPaginatedNotificationListFrom } from "#components/notifications/utils";
import { ConsoleLogger } from "#logger/browser";
import {

View File

@@ -1,7 +1,7 @@
import "#components/ak-nav-buttons";
import "#elements/banner/EnterpriseStatusBanner";
import "#elements/notifications/APIDrawer";
import "#elements/notifications/NotificationDrawer";
import "#components/notifications/APIDrawer";
import "#components/notifications/NotificationDrawer";
import "#elements/router/RouterOutlet";
import { globalAK } from "#common/global";
@@ -13,15 +13,16 @@ import { AuthenticatedInterface } from "#elements/AuthenticatedInterface";
import { listen } from "#elements/decorators/listen";
import { WithBrandConfig } from "#elements/mixins/branding";
import { canAccessAdmin, WithSession } from "#elements/mixins/session";
import { AKDrawerChangeEvent } from "#elements/notifications/events";
import { ifPresent } from "#elements/utils/attributes";
import { ThemedImage } from "#elements/utils/images";
import { AKDrawerChangeEvent } from "#components/notifications/events";
import {
DrawerState,
persistDrawerParams,
readDrawerParams,
renderNotificationDrawerPanel,
} from "#elements/notifications/utils";
import { ifPresent } from "#elements/utils/attributes";
import { ThemedImage } from "#elements/utils/images";
} from "#components/notifications/utils";
import Styles from "#user/ak-interface-user.css";
import { ROUTES } from "#user/Routes";

View File

@@ -114,10 +114,6 @@ The worker status reporting change also uses one fewer PostgreSQL connection per
The Admin interface is also less resource-intensive in the browser due to lazy-loaded modals.
### Fewer packages, smaller attack surface
Weve removed 17 packages, trimming bloat and tightening security in one move. Fewer components mean fewer potential vulnerabilities, helping keep your authentik deployments faster, lighter, and more resilient.
### OAuth2 configurable grant types
[OAuth2 providers](../../add-secure-apps/providers/oauth2/index.mdx#oauth-20-flows-and-grant-types) now have a **Grant Types** setting that lets admins explicitly choose which grant types a given provider may use. The available options are Authorization Code, Implicit, Hybrid, Refresh token, Client credentials, Password, and Device-code. Existing providers default to having all grant types enabled to preserve current behavior, but you can now disable any grant types you don't want a particular client to use — useful for tightening security on individual integrations and disabling legacy flows like Implicit or Password where they aren't needed.

View File

@@ -8,64 +8,11 @@ Invitations are another way to create a user, by inviting someone to join your a
You can configure invitations either by:
- using the [invitation wizard](#use-the-invitation-wizard) (recommended; creates the enrollment flow and the invitation in one guided process).
- using [pre-built blueprints](#use-pre-built-blueprints-to-configure-invitations) (good for showcasing multiple flow variations).
- using [pre-built blueprints](#use-pre-built-blueprints-to-configure-invitations) (recommended for quick setup).
- [manually creating flows and stages](#manual-setup-without-blueprints) (for custom configurations).
:::info
You can also create a [policy](../../../customize/policies/) to check whether the invitation was ever used.
:::
## Use the invitation wizard
The invitation wizard, available from the **Directory** > **Invitations** page in the Admin interface, walks you through creating an invitation and (optionally) the enrollment flow it binds to in a single guided process.
### Step 1. Open the wizard
1. Log in to authentik as an administrator and open the authentik Admin interface.
2. Navigate to **Directory** > **Invitations**.
3. Click the caret (>) next to the **New Invitation** button and choose how the wizard should handle the invitation:
- **with Existing Enrollment Flow...**: bind the new invitation to an existing enrollment flow. Only enrollment flows that have an invitation stage bound to them are listed. This is also what the **New Invitation** button does by default.
- **with New Enrollment Flow and Invitation Stage...**: create a new minimal enrollment flow, including an invitation stage, then bind the invitation to it. Use this option when you do not yet have an enrollment flow set up, or when you want a separate enrollment flow for an invitation.
:::info Automatic flow selection
If you choose **with Existing Enrollment Flow...** and only one eligible flow exists, the wizard skips the flow selection step and takes you directly to the invitation details.
:::
### Step 2. Configure the enrollment flow
- If you picked an existing flow, select it from the **Enrollment flow** drop-down and click **Next**.
- If you are creating a new flow, fill in:
- **Flow name**: display name of the new enrollment flow.
- **Flow slug**: the slug for the flow which is included in the URL.
- **Invitation stage name**: name of the invitation stage that will be bound to the new flow.
- **User type**: the user type for users enrolled via this flow.
- **Continue flow without invitation**: when enabled, the flow proceeds to the next stage even when no invitation token is supplied. When disabled, the flow is cancelled if a valid invitation is not provided.
### Step 3. Configure the invitation details
- **Name**: provide a slug-style name for your invitation object (lowercase letters, numbers, and hyphens only).
- **Expires**: select a date and time for when the invitation should expire. Defaults to 48 hours from now.
- **Flow**: read-only; reflects the flow chosen in the previous step.
- **Custom attributes**: (_optional_) YAML or JSON that is loaded into the flow's `prompt_data` context to pre-fill user information. Field keys must match the keys configured in the flow's [prompt stage](../../add-secure-apps/flows-stages/stages/prompt/index.md). See the [example custom attributes](#step-3-create-the-invitation-object) below for sample payloads.
- **Single use**: when enabled, the invitation is deleted after the first successful enrollment.
Click **Next** to create the invitation. If you chose **with New Enrollment Flow and Invitation Stage...**, the supporting blueprint is imported at this point as well.
### Step 4. Share the invitation
After the invitation is created, the wizard's final step shows the **Link to use the invitation**. From there you can:
- Click **Copy Link** to copy the invitation URL to your clipboard.
- Click **Send via Email** to open the email step inside the wizard. Enter:
- **To**: one email per line, or comma/semicolon separated. Each recipient receives a separate email.
- **CC** / **BCC**: (_optional_) recipients for carbon and blind carbon copies.
- **Template**: the email template to use (the default `Invitation` template is recommended).
Click **Send** to queue the emails. They are sent asynchronously by the background worker. Check **System Tasks** for delivery status.
:::note Email configuration required
To send invitation emails, you must have configured email in authentik. Refer to the [Email configuration](../../install-config/email.mdx) documentation for details.
You can also create a [policy](../../../customize/policies/) to see if the invitation was ever used.
:::
## Use pre-built blueprints to configure invitations

View File

@@ -15,7 +15,7 @@ authentik_preview: true
## What is Apple Business Manager?
> Apple Business Manager is a web-based portal for IT administrators, managers, and procurement professionals to manage devices and automate device enrollment.
> Apple Business Manager is a web-based portal for IT administrators, managers, and procurement professionals to manage devices, and automate device enrollment.
>
> Organizations using Apple Business Essentials can allow their users to authenticate into their Apple devices using their IdP credentials, typically their company email addresses.
>
@@ -35,7 +35,7 @@ While this integration guide focuses on Business Manager, the instructions are a
## Authentication flow
This sequence diagram shows a high-level flow between Apple device, authentik, and Apple Business Manager.
This sequence diagram shows a high-level flow between the user's apple device, authentik, and Apple Business Manager.
```mermaid
sequenceDiagram
@@ -53,7 +53,8 @@ sequenceDiagram
```
In short, Apple Business Manager recognizes the email domain as a federated identity provider controlled by authentik. When a user signs in with their email address, Apple redirects them to authentik for authentication. Once authenticated, Apple enrolls the user's device and grants access to Apple services.
In short, Apple Business Manager recognizes the email domain
as a federated identity provider controlled by authentik. When a user signs in with their email address, Apple redirects them to authentik for authentication. Once authenticated, Apple enrolls the user's device and grants access to Apple services.
## Preparation
@@ -61,13 +62,21 @@ By the end of this integration, your users will be able to enroll their Apple de
You'll need to have an authentik instance running and accessible on an HTTPS domain, and an Apple Business Manager user with the role of Administrator or People Manager.
:::warning Apple Business Manager restrictions
:::warning Caveats
Be aware that Apple Business Manager imposes the following restrictions on federated authentication:
- Federated authentication should use the users email address as their username. Aliases arent supported.
- Existing users with an email address in the federated domain will automatically be converted to federated authentication, effectively _taking ownership_ of the account.
- User accounts with the role of Administrator, Site Manager, or People Manager cant sign in using federated authentication; they can only manage the federation process.
:::
:::
### Placeholders
The following placeholders are used in this guide:
- `authentik.company`: The FQDN of the authentik installation.
## authentik configuration
@@ -85,18 +94,18 @@ Apple Business Manager requires that we create three scope mappings for our OIDC
#### User profile information
Apple Business Manager requires both a given name and family name in the OIDC claim. The example expression below assumes that the user's name is formatted with the given name first, followed by the family name, delimited by a space.
1. From the authentik Admin interface, navigate to **Customization > Property Mappings** and click **Create**.
Consider adjusting the expression to match the name format used in your organization.
1. Log in to authentik as an administrator and open the authentik Admin interface.
2. Navigate to **Customization** > **Property Mappings** and click **Create**.
3. Select **Scope Mapping** and set the following values:
2. Select **Scope Mapping** and use the following values:
- **Name**: `Apple Business Manager profile`
- **Scope Name**: `profile`
- **Description**: _[optional]_ Set to inform user
- **Expression**:
Apple Business Manager requires both a given name and family name in the OIDC claim. The example expression below assumes that the user's name is formatted with the given name first, followed by the family name, delimited by a space.
```python
Consider adjusting the expression to match the name format used in your organization.
```py
given_name, _, family_name = request.user.name.partition(" ")
return {
@@ -105,129 +114,151 @@ Consider adjusting the expression to match the name format used in your organiza
}
```
4. Click **Finish**.
3. Click **Finish** and confirm that new scope mapping is listed in the **Property Mappings** overview.
#### Read access
1. Log in to authentik as an administrator and open the authentik Admin interface.
2. Navigate to **Customization** > **Property Mappings** and click **Create**.
3. Select **Scope Mapping** and set the following values:
1. On the **Property Mappings** list, click **Create**.
2. Select **Scope Mapping** and use the following values:
- **Name**: `Apple Business Manager ssf.read`
- **Scope Name**: `ssf.read`
- **Description**: _[optional]_ Set to inform user
- **Expression**: `return {}`
4. Click **Finish**.
3. Click **Finish** and confirm that new scope mapping is listed in the **Property Mappings** overview.
#### Management access
1. Log in to authentik as an administrator and open the authentik Admin interface.
2. Navigate to **Customization** > **Property Mappings** and click **Create**.
3. Select **Scope Mapping** and set the following values:
1. On the **Property Mappings** list, click **Create**.
2. Select **Scope Mapping** and use the following values:
- **Name**: `Apple Business Manager ssf.manage`
- **Scope Name**: `ssf.manage`
- **Description**: _[optional]_ Set to inform user
- **Expression**: `return {}`
4. Click **Finish**.
3. Click **Finish** and confirm that new scope mapping is listed in the **Property Mappings** overview.
### 2. Create signing key
### 2. Create signing keys
You will need to create a **Signing Key** to sign Security Event Tokens (SET).
You will need to create **Signing Key** to sign Security Event Tokens (SET).
This key is used to both sign and verify the SETs that are sent between authentik and Apple Business Manager.
You can either generate a new key or import an existing one. It is recommended to use the same key for both the OIDC and SSF providers.
You can either generate a new key or import an existing one.
#### Generate a new key
1. Log in to authentik as an administrator and open the authentik Admin interface.
2. Navigate to **System** > **Certificates** and click **Generate Certificate-Key Pair**.
3. Provide a **Certificate Name** and click **Generate Certificate-Key Pair**.
1. From the Admin interface, navigate to **System > Certificates**
2. Click **Generate**, select **Signing Key**, and use the following values:
- **Common Name**: `apple-business-manager`
3. Click **Generate** and confirm that the new key is listed in the **Certificates** overview.
#### Import an existing key
Alternatively, you can import an existing key.
Alternatively, you can use an existing key if you have one available.
1. Log in to authentik as an administrator and open the authentik Admin interface.
2. Navigate to **System** > **Certificates** and click **Import Existing Certificate-Key Pair**.
3. Provide a **Certificate Name**, paste the contents of your **Certificate**, and _optionally_ paste your **Private Key**.
4. Click **Import Certificate-Key Pair**.
1. From the Admin interface, navigate to **System > Certificates**.
2. Click **Create** and use the following values:
- **Name**: `apple-business-manager`
- **Certificate**: Paste in your certificate
- **Private Key**: _[optional]_ Paste in your private key
3. Click **Create** and confirm that the new key is listed in the **Certificates** overview.
### 3. Create OIDC provider
You will need to create an [OAuth2/OpenID Provider](/docs/add-secure-apps/providers/oauth2/) to handle the authentication flow between authentik and Apple Business Manager.
:::tip Keep your text editor ready
1. Log in to authentik as an administrator and open the authentik Admin interface.
2. Navigate to **Applications** > **Providers** and click **New Provider** to open the provider wizard.
- **Choose a Provider type**: select **OAuth2/OpenID Provider** as the provider type.
- **Configure the Provider**: provide a name (or accept the auto-provided name), the authorization flow to use for this provider, and the following required configurations.
- Note the **Client ID** and **Client Secret** values because they will be required later.
- Set a `Strict` redirect URI to `https://gsa-ws.apple.com/grandslam/GsService2/acs`.
- Select any available signing key.
- Under **Advanced protocol settings**, in addition to the default scopes, add the four following **Selected Scopes** to the provider.
- `Apple Business Manager ssf.manage`
- `Apple Business Manager ssf.read`
- `Apple Business Manager profile`
- `authentik default OAuth Mapping: OpenID 'offline_access'`
authentik will automatically generate the **Client ID** and **Client Secret** values for the new provider. You'll need these values when configuring Apple Business Manager.
3. Click **Create**.
You can always find your provider's generated values by navigating to **Providers**, selecting the provider by name, and clicking the **Edit** button.
:::
1. From the authentik Admin interface, navigate to **Applications > Providers** and click **Create**.
2. For the **Provider Type** select **OAuth2/OpenID Provider**, click **Next**, and use the following values.
- **Name**: `Apple Business Manager`
- **Authorization flow**: Select a flow that suits your organization's requirements.
- **Protocol settings**:
- **Client ID**: Copy the generated value to your text editor.
- **Client Secret**: Copy the generated value to your text editor.
- **Redirect URIs/Origins**:
- `Strict`
- **URL**: `https://gsa-ws.apple.com/grandslam/GsService2/acs`
- **Signing Key**: Select a certificate to sign the OpenID Connect tokens.
- **Advanced protocol settings**:
Any fields that can be left as their default values are omitted from the list.
- **Scopes**: Add four **Selected Scopes** to the provider.
- [x] `Apple Business Manager ssf.manage`
- [x] `Apple Business Manager ssf.read`
- [x] `Apple Business Manager profile`
- [x] `authentik default OAuth Mapping: OpenID 'profile'`
3. Click **Finish** and confirm that `Apple Business Manager` is listed in the provider overview.
4. Navigate to **Applications > Providers** and click `Apple Business Manager`.
5. Copy the **OpenID Configuration URL** field to your text editor.
### 4. Create Shared Signals Framework provider
While the OIDC provider handles the authentication flow, you'll need to create a [Shared Signals Framework provider](/docs/add-secure-apps/providers/ssf/) to handle the backchannel communication between authentik and Apple Business Manager.
1. Log in to authentik as an administrator and open the authentik Admin interface.
2. Navigate to **Applications** > **Providers** and click **New Provider** to open the provider wizard.
- **Choose a Provider type**: select **Shared Signals Framework Provider** and the provider type.
- **Configure the Provider**: provide a name (or accept the auto-provided name), and the following required configurations.
- Select the same signing key that you selected for the OIDC provider.
1. From the authentik Admin interface, navigate to **Applications > Providers** and click **Create**.
2. Select **Shared Signals Framework Provider** and use the following values.
Any fields that can be left as their default values are omitted from the list.
- **Name** `Apple Business Manager SSF`
- **Signing Key**: `[Your Signing Key]`
- **Event Retention**: `days=30`
3. Click **Create**.
3. Click **Finish** and confirm that the new SSF provider is listed in the overview.
:::note A Blank SSF Config URL is expected
The **SSF Config URL** will be blank until the SSF provider is assigned to an application as a backchannel provider. We'll return to collect this URL after creating the application.
:::
:::tip A blank SSF Config URL is expected
Keep in mind the **SSF Config URL** will be blank until the SSF provider is assigned to an application as a backchannel provider. We'll return to collect this URL after creating the application.
:::
### 5. Assign SSF permissions
The authentik user you will use to test the stream connection to Apple Business Manager must either have the role of superuser (such as the default `akadmin` account) or have permission to **Add stream to SSF provider**.
The authentik user you will use to test the stream connection to Apple Business Manager must either have the role of superuser or have permission to add streams to the SSF provider.
If not using a superuser account, you can assign the correct permission by following these steps:
1. From authentik the Admin interface, navigate to **Applications > Providers** and click the Apple Business Manager SSF provider.
1. Log in to authentik as an administrator and open the authentik Admin interface.
2. Navigate to **Directory** > **Roles** and click **New Role**.
3. Provide a name for the new role and click **Create Role**.
4. Click on the name of the newly created role and open the **Users** tab.
5. Add whichever user you want to have the permission.
6. Navigate to **Applications** > **Providers** and click on the name of the SSF provider.
7. Open the **Permissions** tab and click **Assign Role Object Permission**.
8. Select the newly created role, toggle on **Add stream to SSF provider**, and click **Assign Role Object Permission**.
2. Click the **Permissions** tab, select **User Object Permissions**, and click **Assign to new user**.
3. In the **User** field, enter the object name of the test user performing the initial connection to Apple Business Manager.
4. Set the **Add stream to SSF provider** permission toggle to **On**
5. Click **Assign** and confirm that the user is listed in the **User Object Permissions** list.
### 6. Create application
1. Log in to authentik as an administrator and open the authentik Admin interface.
2. Navigate to **Applications** > **Application**, click the **New Application** dropdown, click **with Existing Provider**, and set the following required values:
- **Application Name**: `Apple Business Manager`
1. From the authentik Admin interface, navigate to **Applications > Applications**, click **Create**, and use the following values:
- **Name**: Apple Business Manager
- **Slug**: `abm`
- **Provider**: Select the OIDC provider that you created
- **Backchannel Provider:** Select the SSF provider that you created
- **Provider**: `Apple Business Manager`
- **Backchannel Provider:** `Apple Business Manager SSF`
3. Click **Create application**.
4. Navigate to **Application** > **Providers** and click on the name of the SSF provider.
5. On the **Overview** tab, take note of the `SSF Config URL` value.
6. Navigate to **Application** > **Providers** and click on the name of the OIDC provider.
7. On the **Overview** tab, take note of the `OpenID Configuration URL` value.
2. Click **Create** and confirm that the application is listed in the overview page.
3. Navigate to **Providers > Apple Business Manager SSF**
- On the **Overview** tab copy the `SSF Config URL` value to your text editor.
### 7. Confirm and modify copied authentik values
Before proceeding to Apple Business Manager, let's go over the values that you have copied from authentik.
- Verify that you have all the necessary values:
- From the OIDC provider:
- `Client ID`
- `Client Secret`
- `OpenID Configuration URL`
- Verify that you have all the necessary values in your text editor:
- From the `Apple Business Manager` provider:
- [x] `Client ID`
- [x] `Client Secret`
- [x] `OpenID Configuration URL`
- From the SSF provider:
- `SSF Config URL`
- From the `Apple Business Manager SSF` provider:
- [x] `SSF Config URL`
## Apple Business Manager configuration
@@ -239,58 +270,67 @@ Similar to a personal Apple account, a _Managed Apple Account_ uses an email add
By verifying the domain, Apple Business Manager will delegate ownership of any accounts with a matching email address to the organization, allowing for centralized management of devices, apps, and services.
1. Log in to the [Apple Business Manager dashboard](https://business.apple.com/) as an administrator.
2. Click **your account name** in the sidebar, then select **Preferences**.
3. From the Preferences page, select **Managed Apple Accounts** tab, click **Add Domain**, and then provide your domain name.
1. From the [Apple Business Manager dashboard](https://business.apple.com/), click **your account name** on the sidebar, then select **Preferences**.
2. From the Preferences page, select **Managed Apple Accounts** tab, click **Add Domain** and then provide your domain name.
Apple will generate a DNS TXT record that you'll need to add to your domain's DNS settings.
4. Wait for DNS propagation and click **Verify** to complete the domain verification process.
3. Wait for DNS propagation and click **Verify** to complete the domain verification process.
A confirmation dialog will prompt you to lock your domain before you can proceed with the next steps.
:::warning Locking your domain affects all enrolled users
Locking your domain ensures that only your organization can use your domain for federated authentication.
**Once locked, your enrolled users will not be able to access Apple services until you complete the next steps to configure federated authentication.**
**Only lock your domain when you're ready to proceed with the next steps.**
:::
5. In the confirmation dialog, set the **Lock Domain** toggle to **On** and confirm that the domain displays as locked in the **Managed Apple Accounts** tab.
4. In the confirmation dialog, set the **Lock Domain** toggle to **On** and confirm that the domain displays as locked in the **Managed Apple Accounts** tab.
### 2. Capture all accounts _(optional)_
### 2. Capture all accounts
Optionally, you may choose to [capture all accounts](https://support.apple.com/guide/apple-business-manager/capture-a-domain-axm512ce43c3/1/web/1), which will convert all existing accounts with an email address in the federated domain to _Managed Apple Accounts_. You can also choose to capture all accounts at a later time when you're ready to manage all users in the domain.
:::danger Account capture is one-way migration
Choosing to capture all accounts will affect all users with an email address in the federated domain, regardless of their enrollment status or device ownership.
**Once captured, the accounts can't be reverted to personal Apple accounts even if the domain is unlocked.**
**Only capture accounts if you're sure that every user in the domain should be managed by Apple Business Manager.**
:::
1. Log in to the [Apple Business Manager dashboard](https://business.apple.com/) as an administrator.
2. Click **your account name** in the sidebar, then select **Preferences**.
3. From the Preferences page, select **Managed Apple Accounts** tab, and click **Manage** next to the domain you've verified.
4. In your domain's management dialog, ensure you understand the implications of capturing all accounts and then click **Capture All Accounts**.
5. Wait for Apple to complete the account capture process, and confirm that all accounts are now managed by Apple Business Manager.
1. From the [Apple Business Manager dashboard](https://business.apple.com/), click **your account name** on the sidebar, then select **Preferences**.
2. From the Preferences page, select **Managed Apple Accounts** tab, and click **Manage** next to the domain you've verified.
3. In your domain's management dialog, ensure you understand the implications of capturing all accounts and then click **Capture All Accounts**.
4. Wait for Apple to complete the account capture process, and confirm that all accounts are now managed by Apple Business Manager.
### 3. Enable federated authentication
You're now ready to configure federated authentication with authentik.
1. Log in to the [Apple Business Manager dashboard](https://business.apple.com/) as an administrator.
2. Click **your account name** in the sidebar, then select **Preferences**.
3. From the Preferences page, select **Managed Apple Accounts** tab, and click **Get Started** under the "User sign in and directory sync" section.
4. To define how you want users to sign in, choose **Custom Identity Provider** and click **Continue**.
5. On the **Set up your Custom Identity Provider** page, use the following values:
- **Name**: `authentik`
- **Client ID**: `Client ID` from authentik
- **Client Secret**: `Client Secret` from authentik
- **SSF Config URL**: `SSF Config URL` from authentik
- **OpenID Config URL**: `OpenID Configuration URL` from authentik
1. From the Apple Business Manager dashboard, click **your account name** on the sidebar, then select **Preferences**.
6. Click **Continue** to begin Apple's verification of your configuration.
7. When prompted to authenticate through your authentik instance, provide your credentials and click **Log In**.
2. From the Preferences page, select **Managed Apple Accounts** tab, and click **Get Started** under the "User sign in and directory sync" section.
3. To define how you want users to sign in, choose **Custom Identity Provider** and click **Continue**.
4. On the **Set up your Custom Identity Provider** page, use the following values:
- **Name**: `authentik`
- **Client ID**: _`Your Client ID`_
- **Client Secret**: _`Your Client Secret`_
- **SSF Config URL**: **_`Your SSF Config URL with 443 port`_**
- **OpenID Config URL**: **_`Your OpenID Config URL with 443 port`_**
5. Click **Continue** to begin Apple's verification of your configuration.
6. When prompted to authenticate through your authentik instance, provide your credentials and click **Log In**.
When the test finishes, click **Done** to complete the configuration.
@@ -302,17 +342,18 @@ If the connection test fails, your configuration may be incorrect. Here are some
- [x] Verify that the Client ID and Client Secret values are correct.
- [x] Verify that scope mappings are created and all assigned to the OIDC provider.
- [x] Verify that the SSF provider is assigned to the application.
- [x] Ensure that the SSF Config URL and OpenID Configuration URL are accurate.
- [x] Ensure that the OAuth and SSF providers both have signing keys set. Ideally the same certificate should be used for both.
- [x] Ensure that the SSF Config URL and OpenID Configuration URL include the port number `443`.
If you're still having issues, check your authentik instance's log for any errors that might have occurred during the authentication process. If Apple can reach your authentik instance, you should see logs indicating Apple's attempts to test the authentication flow.
## Configuration verification
:::warning Administrators cannot use federated authentication
Apple Business Manager does not allow users with the role of Administrator, Site Manager, or People Manager to log in using federated authentication.
When creating test users, ensure that their role is set to Standard (or Student) to test federated authentication with authentik.
:::
### 1. Create a test user
@@ -325,14 +366,17 @@ When creating test users, ensure that their role is set to Standard (or Student)
- **Role**: `Standard`
3. Click **Save** to create the user account, and then click **Create Sign-In** in the user's profile.
4. When prompted to choose a delivery method, select **Create a downloadable PDF and CSV** and click **Continue**. Note the temporary password provided on the next page, optionally downloading the PDF and CSV files for future reference.
5. Confirm the user is created from the authentik Admin interface by navigating to the **Users** page and searching for the account by their email address. Note that this may take a few minutes to synchronize.
### 2. Test the authentication flow
1. Confirm that the test user is synchronized in authentik.
1. Confirmed the test user in synchronized in authentik.
2. Open a private browsing window and navigate to the [Apple Business Manager](https://business.apple.com/).
3. In the email field, provide the email address assigned to the test user.
3. In the email field, provide the email address assigned to test user.
4. Submit the form to trigger the authentication flow.
You should be redirected to authentik for authentication and then back to Apple Business Manager to manage the test user's account.