diff --git a/config/permissions/akP-jellyfin-admin.yaml b/config/permissions/akP-jellyfin-admin.yaml new file mode 100644 index 0000000..ce96197 --- /dev/null +++ b/config/permissions/akP-jellyfin-admin.yaml @@ -0,0 +1,3 @@ +# Permission group akP-jellyfin-admin (name = filename). Grants admin +# access to jellyfin: bound to the jellyfin application and mapped to its admin role. +application: jellyfin diff --git a/config/permissions/akP-jellyfin-user.yaml b/config/permissions/akP-jellyfin-user.yaml new file mode 100644 index 0000000..77aa33f --- /dev/null +++ b/config/permissions/akP-jellyfin-user.yaml @@ -0,0 +1,3 @@ +# Permission group akP-jellyfin-user (name = filename). Grants user +# access to jellyfin: bound to the jellyfin application and mapped to its user role. +application: jellyfin diff --git a/config/providers_oauth2/jellyfin.yaml b/config/providers_oauth2/jellyfin.yaml new file mode 100644 index 0000000..6aff889 --- /dev/null +++ b/config/providers_oauth2/jellyfin.yaml @@ -0,0 +1,29 @@ +# OAuth2/OIDC provider + application for Jellyfin +# (jellyfin.k8s.syd1.au.unkin.net), consumed by jellyfin-plugin-sso (OIDC) so +# the web UI signs in via Authentik while native clients keep Jellyfin local/API +# auth. client_secret is read from Vault, not committed. The plugin requests the +# `ak_groups` scope and matches the hierarchical groups claim against +# akP-jellyfin-admin / akP-jellyfin-user for its admin/user role mapping, so no +# role_mappings claim is needed here. The path segment "authentik" is the SSO +# provider name configured in the plugin — it must match on the Jellyfin side. +name: Jellyfin +authorization_flow: default-provider-authorization-implicit-consent +invalidation_flow: default-provider-invalidation-flow +client_type: confidential +client_id: jellyfin +# Explicit dashboard tile launch URL (the Jellyfin web UI). +launch_url: https://jellyfin.k8s.syd1.au.unkin.net/ +client_secret_vault: + mount: kv + path: kubernetes/namespace/jellyfin/default/oauth-credentials +scope_mappings: + - goauthentik.io/providers/oauth2/scope-openid + - goauthentik.io/providers/oauth2/scope-email + - goauthentik.io/providers/oauth2/scope-profile +redirect_uris: + # jellyfin-plugin-sso OIDC callback (plugin >= 3.5.2). + - matching_mode: strict + url: https://jellyfin.k8s.syd1.au.unkin.net/sso/OID/redirect/authentik + # Legacy plugin callback path, kept so older plugin builds also work. + - matching_mode: strict + url: https://jellyfin.k8s.syd1.au.unkin.net/sso/OID/r/authentik diff --git a/config/roles/akR-global-admin.yaml b/config/roles/akR-global-admin.yaml index d7df0fc..da54850 100644 --- a/config/roles/akR-global-admin.yaml +++ b/config/roles/akR-global-admin.yaml @@ -4,6 +4,7 @@ permissions: - akP-argocd-admin - akP-rancher-admin - akP-litellm-admin + - akP-jellyfin-admin # arrstack has no admin tier (it is a proxy front door); grant global admins # the front door plus every per-app entitlement so they reach all media apps. - akP-arrstack-user diff --git a/config/roles/akR-standard-user.yaml b/config/roles/akR-standard-user.yaml index 705ad69..0073be9 100644 --- a/config/roles/akR-standard-user.yaml +++ b/config/roles/akR-standard-user.yaml @@ -4,3 +4,4 @@ permissions: - akP-argocd-user - akP-rancher-user - akP-litellm-user + - akP-jellyfin-user