diff --git a/config/providers_oauth2/litellm.yaml b/config/providers_oauth2/litellm.yaml index ebc28c7..0c35e40 100644 --- a/config/providers_oauth2/litellm.yaml +++ b/config/providers_oauth2/litellm.yaml @@ -6,6 +6,10 @@ authorization_flow: default-provider-authorization-implicit-consent invalidation_flow: default-provider-invalidation-flow client_type: confidential client_id: litellm +# Explicit dashboard tile launch URL (the LiteLLM UI). Authentik would otherwise +# derive this from the redirect_uri; setting it here makes the tile deterministic +# and forces an application re-save so the cached access policy is re-evaluated. +launch_url: https://litellm.k8s.syd1.au.unkin.net/ client_secret_vault: mount: kv path: kubernetes/namespace/litellm/default/oauth-credentials diff --git a/modules/authentik/main.tf b/modules/authentik/main.tf index 7d2687e..81c0def 100644 --- a/modules/authentik/main.tf +++ b/modules/authentik/main.tf @@ -199,6 +199,8 @@ resource "authentik_application" "oauth2" { name = each.value.name slug = each.key protocol_provider = authentik_provider_oauth2.this[each.key].id + # Null keeps Authentik's derived launch URL (from the first redirect_uri). + meta_launch_url = each.value.launch_url } resource "authentik_application" "ldap" { diff --git a/modules/authentik/variables.tf b/modules/authentik/variables.tf index ba09e75..54ac455 100644 --- a/modules/authentik/variables.tf +++ b/modules/authentik/variables.tf @@ -82,6 +82,11 @@ variable "providers_oauth2" { })), []) signing_key = optional(string, null) access_token_validity = optional(string, "minutes=10") + # Explicit launch URL for the app tile on the user dashboard ("My + # applications"). Null lets Authentik derive it from the first redirect_uri; + # set it to the app's UI to make the tile deterministic and to force an + # application re-save (which invalidates Authentik's cached access policy). + launch_url = optional(string, null) # Optional app-role claim computed from (hierarchical) group membership: emit # `claim` = the first matching rule's role, else `default`. The app requests # `claim` as a scope and reads it (e.g. LiteLLM GENERIC_USER_ROLE_ATTRIBUTE).