-
Notifications
You must be signed in to change notification settings - Fork 4
First Time Setup
This page covers the admin's initial configuration, a user enrolling in 2FA, passkeys, and getting native apps / TVs signed in.
- Install the plugin (see Installation) and restart Jellyfin.
- Go to Dashboard → Plugins → Jellyfin Security.
- Open the Settings tab and verify:
- ✅ Enabled — master switch.
- ✅ Require for all users — off by default. When on, every user with a password must enroll (existing trusted sessions keep working). When off, 2FA is opt-in per user.
- ✅ LAN Bypass — skip 2FA when the request comes from a LAN IP (
192.168/16,10/8,172.16/12by default). Convenient, fewer prompts on local devices. - Email OTP — optional fallback if a user loses their authenticator. Requires SMTP (see Email / SMTP).
- (Optional) Configure Notifications (Gotify, ntfy, or webhook) to get alerts when someone triggers a 2FA prompt.
If Jellyfin sits behind Cloudflare, nginx, Caddy, or Traefik:
- Enable Trust X-Forwarded-For.
- Add your proxy IPs (or Cloudflare's IP ranges) to Trusted Proxy CIDRs.
Without this, rate limiting collapses to a single bucket because every request appears to come from the proxy's loopback address.
⚠ Don't paste broad RFC1918 ranges (e.g.
10.0.0.0/8) into Trusted Proxy CIDRs. The SEC-H3 LAN-bypass guard can't tell a "stale-XFF proxy" from a "direct LAN client in a broad range", and LAN bypass will silently refuse for every LAN client. List your proxy's actual address(es). See Troubleshooting if LAN bypass stops working.
- Sign in to Jellyfin normally (no 2FA yet).
- Open Profile → Two-Factor Authentication (or visit
https://your-jellyfin/TwoFactorAuth/Setup). - Click Set up Authenticator App.
- Scan the QR code with your authenticator (Google Authenticator, Authy, 1Password, Bitwarden, etc.).
- Enter the 6-digit code to confirm.
- Generate recovery codes — you get 10 single-use codes. Save them in your password manager; each can sign you in if you lose your phone.
- (Optional) Add your email under Email OTP as a backup factor.
- Sign in at
/webwith username + password as usual. - You're redirected to the 2FA challenge page.
- Enter the 6-digit code from your authenticator.
- Done — this browser is trusted for 30 days (cookie bound to your device).
Passkeys replace the 6-digit code with a biometric or hardware tap. They're phishing-resistant (the credential is bound to your exact domain) and require no typing.
Server config first. Passkeys require HTTPS and a matching WebAuthn Relying Party ID + origin. In Settings → WebAuthn / passkeys:
- Relying Party ID — your public hostname only:
jellyfin.example.com(nohttps://, no port, no path).- Allowed origins — one per line, full origin incl. scheme/port:
https://jellyfin.example.com(add every URL users actually hit).Skip this and browsers refuse to register/use passkeys (Safari is strictest).
Desktop: Setup → Passkeys card → (optional label) → Add a passkey → confirm with Windows Hello / Touch ID / YubiKey.
iPhone (Safari): open your Jellyfin HTTPS URL (the configured origin, not a bare LAN IP) → sign in → Setup → Passkeys → label it → Add a passkey → confirm with Face ID/Touch ID. Saved to iCloud Keychain, syncs across your Apple devices.
Android (Chrome): open your Jellyfin HTTPS URL → sign in → Setup → Passkeys → label it → Add a passkey → confirm with fingerprint/face. Saved to Google Password Manager.
Android gotchas:
- "Add a passkey" does nothing → your phone needs a screen lock (PIN/pattern/biometric).
- "No passkey provider available" → enable Google Password Manager (or set Bitwarden/1Password as default credential provider).
- Samsung Internet sometimes hides the button — use Chrome.
Using a passkey: username + password → at the 2FA page tap 🔑 Use a passkey instead → confirm. No code typed.
Passkeys are browser-only (WebAuthn). Native apps can't use them — use device pairing below. Passkeys replace the 2FA code step, not your password.
Native apps don't know the 2FA flow, so the plugin uses device pairing:
- Open the native app and sign in with username + password.
- The app shows "Invalid" or fails to load — that's expected; the server recorded a pending pairing.
- On an already-trusted device (laptop, phone browser) go to Setup → Devices Waiting for Approval.
- Find the TV/app → click Trust.
- Retry sign-in on the TV/app — it works and is remembered permanently.
Use app passwords: Setup → App Passwords → Generate. You get a one-time-shown random password; use it in place of your Jellyfin password. Matched via PBKDF2 hash, bypasses the 2FA prompt, individually revocable.
Use Jellyfin's standard API keys (Dashboard → API Keys). API-key auth bypasses user authentication, so 2FA doesn't apply.
Getting started
Features
Reference
Help