--- description: "Konfigurera Single Sign-On med OpenID Connect. Steg-för-steg-guider för Keycloak, Authentik, Google och andra OIDC-leverantörer." i18n_source_hash: 4296343b3cc5 i18n_provenance: human i18n_output_hash: b3ed5df413a2 --- # OIDC / Single Sign-On {#oidc-single-sign-on} SnapOtter stöder OpenID Connect (OIDC) för single sign-on. Användare kan logga in med en extern identitetsleverantör som Keycloak, Authentik eller Google i stället för (eller vid sidan av) lokal autentisering med användarnamn/lösenord. ::: tip Se även [SAML SSO](/sv/guide/saml) | [SCIM-provisionering](/sv/guide/scim) | [Användare, roller och behörigheter](/sv/guide/users-roles) ::: ## Snabbstart {#quick-start} Lägg till dessa miljövariabler i din `docker-compose.yml`: ```yaml services: SnapOtter: image: snapotter/snapotter:latest environment: EXTERNAL_URL: "https://photos.example.com" OIDC_ENABLED: "true" OIDC_ISSUER_URL: "https://auth.example.com/realms/myrealm" OIDC_CLIENT_ID: "snapotter" OIDC_CLIENT_SECRET: "your-secret-here" ``` Omdirigerings-URI:n för din leverantör är alltid: ``` ${EXTERNAL_URL}/api/auth/oidc/callback ``` Om till exempel `EXTERNAL_URL` är `https://photos.example.com`, konfigurerar du din leverantörs omdirigerings-URI som `https://photos.example.com/api/auth/oidc/callback`. ## Konfigurationsreferens {#configuration-reference} | Variabel | Standard | Beskrivning | |---|---|---| | `OIDC_ENABLED` | `false` | Aktivera OIDC-inloggning. En "Logga in med SSO"-knapp visas på inloggningssidan. | | `OIDC_ISSUER_URL` | | Leverantörens issuer-URL. Måste stödja OIDC Discovery (`/.well-known/openid-configuration`). | | `OIDC_CLIENT_ID` | | OAuth-klient-ID registrerat hos din leverantör. | | `OIDC_CLIENT_SECRET` | | OAuth-klienthemlighet. | | `OIDC_SCOPES` | `openid profile email` | Blankstegsseparerad lista över scopes att begära. | | `OIDC_AUTO_CREATE_USERS` | `true` | Skapa automatiskt ett lokalt användarkonto vid första OIDC-inloggningen. | | `OIDC_DEFAULT_ROLE` | `user` | Roll som tilldelas automatiskt skapade OIDC-användare. En av `admin`, `editor` eller `user`. | | `OIDC_AUTO_LINK_USERS` | `false` | Länka en OIDC-identitet till en befintlig lokal användare om e-postadressen matchar. | | `OIDC_PROVIDER_NAME` | | Visningsnamn som visas på inloggningsknappen (t.ex. "Keycloak", "Google"). Om tomt står det "SSO" på knappen. | | `OIDC_CLOCK_TOLERANCE` | `30` | Tolerans för klockavvikelse i sekunder vid tokenvalidering. | | `OIDC_USERNAME_CLAIM` | `preferred_username` | ID-token-claim som används som användarnamn för nya konton. | | `EXTERNAL_URL` | | Den publika URL där SnapOtter är nåbar. Krävs för att OIDC ska kunna bygga den korrekta omdirigerings-URI:n. | | `COOKIE_SECRET` | autogenererad | Hemlighet för att signera sessionscookies. Sätt denna uttryckligen när du kör flera repliker. | ## Leverantörsguider {#provider-guides} ### Keycloak {#keycloak} 1. Skapa en ny realm (eller använd en befintlig). 2. Gå till **Clients** och skapa en ny klient: - **Client ID**: `snapotter` - **Client authentication**: On (confidential) - **Authentication flow**: Standard flow (Authorization Code) 3. Under klientens **Settings**-flik, sätt **Valid redirect URIs** till din callback-URL (t.ex. `https://photos.example.com/api/auth/oidc/callback`). 4. Kopiera **Client secret** från **Credentials**-fliken. 5. Sätt `OIDC_ISSUER_URL` till `https://keycloak.example.com/realms/your-realm`. ### Authentik {#authentik} 1. I administratörsgränssnittet, gå till **Applications > Providers** och skapa en ny **OAuth2/OpenID Provider**. - **Client type**: Confidential - **Redirect URIs**: Din callback-URL - **Signing key**: Välj en befintlig nyckel eller skapa en 2. Skapa en **Application** och länka den till leverantören. 3. Kopiera **Client ID** och **Client Secret** från leverantörsinställningarna. 4. Sätt `OIDC_ISSUER_URL` till `https://authentik.example.com/application/o/snapotter/` (det avslutande snedstrecket spelar roll). ### Google {#google} 1. Gå till [Google Cloud Console](https://console.cloud.google.com/). 2. Skapa ett projekt (eller välj ett befintligt). 3. Navigera till **APIs & Services > OAuth consent screen** och konfigurera den. 4. Gå till **APIs & Services > Credentials** och skapa ett **OAuth 2.0 Client ID**: - **Application type**: Web application - **Authorized redirect URIs**: Din callback-URL 5. Kopiera **Client ID** och **Client secret**. 6. Sätt `OIDC_ISSUER_URL` till `https://accounts.google.com`. 7. Sätt `OIDC_USERNAME_CLAIM` till `email` (Google tillhandahåller inte `preferred_username`). ## Användarprovisionering {#user-provisioning} ### Skapa automatiskt {#auto-create} När `OIDC_AUTO_CREATE_USERS` är `true` (standard) skapas ett lokalt användarkonto första gången någon loggar in via OIDC. Användarnamnet hämtas från den claim som anges av `OIDC_USERNAME_CLAIM`, och rollen sätts till `OIDC_DEFAULT_ROLE`. Om en användarnamnskollision uppstår läggs ett numeriskt suffix till (t.ex. `jane` blir `jane_2`). ### Länka automatiskt {#auto-link} När `OIDC_AUTO_LINK_USERS` är `true` länkar SnapOtter en OIDC-identitet till ett befintligt lokalt konto om e-postadresserna matchar. Detta är användbart när du har förskapade användarkonton och vill att de ska börja använda SSO utan att förlora sina data. ::: warning Aktivera endast automatisk länkning om du litar på att din OIDC-leverantör verifierar e-postadresser. En overifierad e-postadress kan tillåta någon att ta över en annan användares konto. ::: ### Inaktivera lokal inloggning {#disabling-local-login} OIDC inaktiverar inte lokal inloggning med användarnamn/lösenord. Båda metoderna förblir tillgängliga. Administratörer kan fortfarande logga in med lokala uppgifter om OIDC-leverantören är onåbar. ## Självsignerade certifikat {#self-signed-certificates} Om din OIDC-leverantör använder ett självsignerat eller privat CA-certifikat monterar du CA-bundlen in i containern och pekar `NODE_EXTRA_CA_CERTS` mot den: ```yaml services: SnapOtter: image: snapotter/snapotter:latest volumes: - ./my-ca.pem:/etc/ssl/certs/custom-ca.pem:ro environment: NODE_EXTRA_CA_CERTS: /etc/ssl/certs/custom-ca.pem OIDC_ENABLED: "true" OIDC_ISSUER_URL: "https://auth.internal.example.com/realms/myrealm" OIDC_CLIENT_ID: "snapotter" OIDC_CLIENT_SECRET: "your-secret-here" ``` ::: danger Sätt inte `NODE_TLS_REJECT_UNAUTHORIZED=0`. Detta inaktiverar all TLS-verifiering och är en säkerhetsrisk. ::: ## Felsökning {#troubleshooting} ### Omdirigerings-URI matchar inte {#redirect-uri-mismatch} Det vanligaste felet. Kontrollera dessa skillnader mellan vad din leverantör förväntar sig och vad SnapOtter skickar: - `http` mot `https` - schemat måste matcha exakt - Avslutande snedstreck - vissa leverantörer är strikta med detta - Portnummer - inkludera porten om den är icke-standard - Sökväg - måste vara `/api/auth/oidc/callback` Dubbelkolla `EXTERNAL_URL`. Den måste matcha den URL användare skriver in i sin webbläsare. ### UNABLE_TO_VERIFY_LEAF_SIGNATURE {#unable-to-verify-leaf-signature} OIDC-leverantören använder ett certifikat som Node.js inte litar på. Se [Självsignerade certifikat](#self-signed-certificates) ovan. ### Fel med klockavvikelse {#clock-skew-errors} Om din serverklocka och OIDC-leverantörens klocka inte är synkroniserade kan tokenvalidering misslyckas. Öka `OIDC_CLOCK_TOLERANCE` (standard är 30 sekunder). En bättre lösning är att köra NTP på båda maskinerna. ### "OIDC provider unreachable" {#oidc-provider-unreachable} SnapOtter hämtar leverantörens discovery-dokument vid start och under inloggning. Kontrollera: - DNS-uppslag inifrån Docker-containern (`docker exec snapotter nslookup auth.example.com`) - Brandväggsregler mellan containern och leverantören - Värdet `OIDC_ISSUER_URL` - det måste vara nåbart från servern, inte bara från din webbläsare ### Saknade claims {#missing-claims} Om användarnamn eller e-postadresser är tomma efter inloggning kanske din leverantör inte returnerar de förväntade claims. Verifiera: - Scopes som konfigurerats i `OIDC_SCOPES` inkluderar `profile` och `email` - Leverantören är konfigurerad att inkludera den claim som anges i `OIDC_USERNAME_CLAIM` i ID-token - Vissa leverantörer kräver uttrycklig mapper-/scope-konfiguration för att släppa claims