Replies: 5 comments 3 replies
-
|
I would love to see OIDC on Jellyfin. A lot of people exposing this service to web external. Usually I just use forwardauth for services that don't support OIDC but forwardauth breaks jellyfin's API so I can't use it for this service. Yes please sign me up for some OIDC. |
Beta Was this translation helpful? Give feedback.
-
|
Not having this is what's holding me back from implementing jellyfin. |
Beta Was this translation helpful? Give feedback.
-
|
It's been said before by Jellyfin devs, as much as people want it; there are other things they want more and only so many devs to do it |
Beta Was this translation helpful? Give feedback.
-
RFC: Native-client SSO for Jellyfin — a phased path that doesn't wait on the core identity re-archAuthor: Daniel Orcutt (@snoochyp) ProblemSSO in Jellyfin today ends at the web UI. The Meanwhile, adding OIDC to Jellyfin core is blocked on the identity re-architecture (see the stalled refactor PR and maintainer comments in the native-SSO discussion). That blocker is real, but it shouldn't leave native clients stranded in the interim. Claim: the gap is small. The plugin can already authenticate and issue credentials. What's missing is a native-app-shaped completion path. This RFC proposes one, in two phases, with zero core changes, plus a clean migration story for when the core re-arch lands. Prior artImmich solved this exact problem for its mobile apps: the server is the OIDC relying party; the app opens the system browser; on completion the server redirects to a custom scheme ( Phase 1 — SSO-assisted Quick Connect (smallest PR, unblocks every client, solves TV first)Jellyfin already ships a device-authorization-style flow: Quick Connect. Most native clients (including Swiftfin) already support it. Phase 1 is pure glue: let a web-browser SSO login approve a Quick Connect code. sequenceDiagram
participant TV as Apple TV / any client
participant JF as Jellyfin + SSO plugin
participant Phone as User's phone browser
participant IdP as Google / Authelia
TV->>JF: QuickConnect/Initiate → code "ABX412" (shown on screen)
Note over TV: "Sign in with SSO — go to<br/>https://server/sso/qc and enter ABX412"
Phone->>JF: GET /sso/OID/start/{provider}?quickConnect=ABX412
JF->>IdP: standard OIDC authorization redirect
IdP-->>Phone: user authenticates (with their MFA)
IdP->>JF: callback with code → id_token
JF->>JF: map claims → Jellyfin user (existing plugin logic)
JF->>JF: QuickConnect/Authorize("ABX412") as that user
Phone-->>Phone: "Device approved ✔"
TV->>JF: (polling) QuickConnect/Connect → approved
TV->>JF: Users/AuthenticateWithQuickConnect → standard AccessToken
Server changes (plugin only): carry an optional Client changes: none required (existing Quick Connect UIs work). Optional UX polish: a "Sign in with SSO" hint next to the code. Why this first: it solves the hardest clients (TV boxes — no browser, no custom schemes) with the least code, works for every client at once, and produces an immediately demoable result that builds credibility for Phase 2. Phase 2 — First-class native flow: Authorization Code + PKCE (reference implementation in Swiftfin)Standard OAuth-for-native-apps (RFC 8252 + PKCE RFC 7636), Immich-style: sequenceDiagram
participant App as Swiftfin (iOS)
participant JF as Jellyfin + SSO plugin
participant IdP as Google / Authelia
App->>JF: GET /sso/OID/providers (public)
JF-->>App: [{name:"Google", …}] → login screen shows SSO buttons
Note over App: user taps "Sign in with Google"<br/>ASWebAuthenticationSession opens:
App->>JF: /sso/OID/start/Google?code_challenge=X&redirect_uri=org.jellyfin.swiftfin://oauth-callback
JF->>IdP: OIDC authorization redirect
IdP-->>App: user authenticates in system browser sheet
IdP->>JF: callback → id_token
JF->>JF: map claims → Jellyfin user
JF->>JF: mint one-time code, 30s TTL, single-use
JF-->>App: 302 → org.jellyfin.swiftfin://oauth-callback?code=Y
App->>JF: POST /sso/OID/token {code, code_verifier, deviceInfo}
JF-->>App: standard Jellyfin AccessToken
Note over App: from here the session is indistinguishable<br/>from a username/password login
New plugin surface (3 endpoints):
Swiftfin changes: SSO buttons on the server login view (driven by discovery — local username/password auth remains untouched and default); Android and other clients get the same server contract; Chrome Custom Tabs / equivalent per platform. Swiftfin serves as the reference implementation. Local-auth coexistence (explicit requirement)
Security model
Migration story (why this doesn't fight the core re-arch)The client-facing contract is deliberately tiny ( What I'm offeringI'm prepared to implement this: Phase 1 plugin PR first, then the Phase 2 plugin endpoints + the Swiftfin reference implementation (tested against Authelia and Google on my own infrastructure). Requesting feedback on: (1) appetite for this in |
Beta Was this translation helpful? Give feedback.
-
I also want OIDC. But this statement is false regarding bypassing MFA. I have the LDAP plugin configured with an LDAP outpost. MFA is enforced with Authentik. My users have to type username and then password;token to login. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Jellyfin currently has no native external authentication support. The only options are:
Users running Jellyfin behind a reverse proxy with an identity provider (Authentik, Authelia, Keycloak, etc.) are forced to either expose raw API endpoints, maintain separate credentials, or restrict access to VPN-only.
Add native OIDC/OAuth2 authentication support at the server level, allowing all clients to authenticate via an external identity provider — either through a browser-based redirect flow (similar to how many mobile apps handle OAuth) or through a device authorization flow (RFC 8628).
This would allow:
Beta Was this translation helpful? Give feedback.
All reactions