mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
171 lines
8.5 KiB
Markdown
171 lines
8.5 KiB
Markdown
---
|
|||
|
|
description: "Configura il Single Sign-On con OpenID Connect. Guide passo passo per Keycloak, Authentik, Google e altri provider OIDC."
|
||
|
|
i18n_source_hash: 4296343b3cc5
|
||
|
|
i18n_provenance: human
|
||
|
|
i18n_output_hash: 7784e9aeafd3
|
||
|
|
---
|
||
|
|
|
||
|
|
# OIDC / Single Sign-On {#oidc-single-sign-on}
|
||
|
|
|
||
|
|
SnapOtter supporta OpenID Connect (OIDC) per il single sign-on. Gli utenti possono accedere con un provider di identità esterno come Keycloak, Authentik o Google invece dell'autenticazione locale con username/password (o in aggiunta a essa).
|
||
|
|
|
||
|
|
::: tip Vedi anche
|
||
|
|
[SAML SSO](/it/guide/saml) | [Provisioning SCIM](/it/guide/scim) | [Utenti, ruoli e permessi](/it/guide/users-roles)
|
||
|
|
:::
|
||
|
|
|
||
|
|
## Avvio rapido {#quick-start}
|
||
|
|
|
||
|
|
Aggiungi queste variabili d'ambiente al tuo `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"
|
||
|
|
```
|
||
|
|
|
||
|
|
L'URI di reindirizzamento per il tuo provider è sempre:
|
||
|
|
|
||
|
|
```
|
||
|
|
${EXTERNAL_URL}/api/auth/oidc/callback
|
||
|
|
```
|
||
|
|
|
||
|
|
Ad esempio, se `EXTERNAL_URL` è `https://photos.example.com`, configura l'URI di reindirizzamento del tuo provider come `https://photos.example.com/api/auth/oidc/callback`.
|
||
|
|
|
||
|
|
## Riferimento della configurazione {#configuration-reference}
|
||
|
|
|
||
|
|
| Variabile | Predefinito | Descrizione |
|
||
|
|
|---|---|---|
|
||
|
|
| `OIDC_ENABLED` | `false` | Abilita il login OIDC. Un pulsante "Accedi con SSO" appare nella pagina di login. |
|
||
|
|
| `OIDC_ISSUER_URL` | | URL dell'issuer del provider. Deve supportare OIDC Discovery (`/.well-known/openid-configuration`). |
|
||
|
|
| `OIDC_CLIENT_ID` | | Client ID OAuth registrato presso il tuo provider. |
|
||
|
|
| `OIDC_CLIENT_SECRET` | | Client secret OAuth. |
|
||
|
|
| `OIDC_SCOPES` | `openid profile email` | Elenco di scope da richiedere, separati da spazi. |
|
||
|
|
| `OIDC_AUTO_CREATE_USERS` | `true` | Crea automaticamente un account utente locale al primo login OIDC. |
|
||
|
|
| `OIDC_DEFAULT_ROLE` | `user` | Ruolo assegnato agli utenti OIDC creati automaticamente. Uno tra `admin`, `editor` o `user`. |
|
||
|
|
| `OIDC_AUTO_LINK_USERS` | `false` | Collega un'identità OIDC a un utente locale esistente se l'indirizzo email corrisponde. |
|
||
|
|
| `OIDC_PROVIDER_NAME` | | Nome visualizzato mostrato sul pulsante di login (es. "Keycloak", "Google"). Se vuoto, il pulsante riporta "SSO". |
|
||
|
|
| `OIDC_CLOCK_TOLERANCE` | `30` | Tolleranza dello scarto dell'orologio in secondi per la validazione dei token. |
|
||
|
|
| `OIDC_USERNAME_CLAIM` | `preferred_username` | Claim del token ID usato come username per i nuovi account. |
|
||
|
|
| `EXTERNAL_URL` | | L'URL pubblico su cui SnapOtter è raggiungibile. Richiesto affinché OIDC costruisca l'URI di reindirizzamento corretto. |
|
||
|
|
| `COOKIE_SECRET` | generato automaticamente | Segreto per firmare i cookie di sessione. Impostalo esplicitamente quando esegui più repliche. |
|
||
|
|
|
||
|
|
## Guide dei provider {#provider-guides}
|
||
|
|
|
||
|
|
### Keycloak {#keycloak}
|
||
|
|
|
||
|
|
1. Crea un nuovo realm (o usane uno esistente).
|
||
|
|
2. Vai su **Clients** e crea un nuovo client:
|
||
|
|
- **Client ID**: `snapotter`
|
||
|
|
- **Client authentication**: On (confidential)
|
||
|
|
- **Authentication flow**: Standard flow (Authorization Code)
|
||
|
|
3. Nella scheda **Settings** del client, imposta **Valid redirect URIs** sul tuo URL di callback (es. `https://photos.example.com/api/auth/oidc/callback`).
|
||
|
|
4. Copia il **Client secret** dalla scheda **Credentials**.
|
||
|
|
5. Imposta `OIDC_ISSUER_URL` su `https://keycloak.example.com/realms/your-realm`.
|
||
|
|
|
||
|
|
### Authentik {#authentik}
|
||
|
|
|
||
|
|
1. Nell'interfaccia di amministrazione, vai su **Applications > Providers** e crea un nuovo **OAuth2/OpenID Provider**.
|
||
|
|
- **Client type**: Confidential
|
||
|
|
- **Redirect URIs**: il tuo URL di callback
|
||
|
|
- **Signing key**: seleziona una chiave esistente o creane una
|
||
|
|
2. Crea un'**Application** e collegala al provider.
|
||
|
|
3. Copia il **Client ID** e il **Client Secret** dalle impostazioni del provider.
|
||
|
|
4. Imposta `OIDC_ISSUER_URL` su `https://authentik.example.com/application/o/snapotter/` (la barra finale è importante).
|
||
|
|
|
||
|
|
### Google {#google}
|
||
|
|
|
||
|
|
1. Vai alla [Google Cloud Console](https://console.cloud.google.com/).
|
||
|
|
2. Crea un progetto (o selezionane uno esistente).
|
||
|
|
3. Vai su **APIs & Services > OAuth consent screen** e configuralo.
|
||
|
|
4. Vai su **APIs & Services > Credentials** e crea un **OAuth 2.0 Client ID**:
|
||
|
|
- **Application type**: Web application
|
||
|
|
- **Authorized redirect URIs**: il tuo URL di callback
|
||
|
|
5. Copia il **Client ID** e il **Client secret**.
|
||
|
|
6. Imposta `OIDC_ISSUER_URL` su `https://accounts.google.com`.
|
||
|
|
7. Imposta `OIDC_USERNAME_CLAIM` su `email` (Google non fornisce `preferred_username`).
|
||
|
|
|
||
|
|
## Provisioning degli utenti {#user-provisioning}
|
||
|
|
|
||
|
|
### Creazione automatica {#auto-create}
|
||
|
|
|
||
|
|
Quando `OIDC_AUTO_CREATE_USERS` è `true` (l'impostazione predefinita), un account utente locale viene creato la prima volta che qualcuno accede tramite OIDC. Lo username è tratto dal claim specificato da `OIDC_USERNAME_CLAIM`, e il ruolo è impostato su `OIDC_DEFAULT_ROLE`.
|
||
|
|
|
||
|
|
Se si verifica una collisione di username, viene aggiunto un suffisso numerico (es. `jane` diventa `jane_2`).
|
||
|
|
|
||
|
|
### Collegamento automatico {#auto-link}
|
||
|
|
|
||
|
|
Quando `OIDC_AUTO_LINK_USERS` è `true`, SnapOtter collega un'identità OIDC a un account locale esistente se gli indirizzi email corrispondono. Questo è utile quando hai account utente pre-creati e vuoi che inizino a usare l'SSO senza perdere i loro dati.
|
||
|
|
|
||
|
|
::: warning
|
||
|
|
Abilita il collegamento automatico solo se ti fidi del tuo provider OIDC per la verifica degli indirizzi email. Un'email non verificata potrebbe consentire a qualcuno di impossessarsi dell'account di un altro utente.
|
||
|
|
:::
|
||
|
|
|
||
|
|
### Disattivazione del login locale {#disabling-local-login}
|
||
|
|
|
||
|
|
OIDC non disattiva il login locale con username/password. Entrambi i metodi restano disponibili. Gli amministratori possono comunque accedere con credenziali locali se il provider OIDC è irraggiungibile.
|
||
|
|
|
||
|
|
## Certificati autofirmati {#self-signed-certificates}
|
||
|
|
|
||
|
|
Se il tuo provider OIDC utilizza un certificato autofirmato o di una CA privata, monta il bundle della CA nel container e fai puntare `NODE_EXTRA_CA_CERTS` a esso:
|
||
|
|
|
||
|
|
```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
|
||
|
|
Non impostare `NODE_TLS_REJECT_UNAUTHORIZED=0`. Ciò disabilita tutta la verifica TLS ed è un rischio per la sicurezza.
|
||
|
|
:::
|
||
|
|
|
||
|
|
## Risoluzione dei problemi {#troubleshooting}
|
||
|
|
|
||
|
|
### Mancata corrispondenza dell'URI di reindirizzamento {#redirect-uri-mismatch}
|
||
|
|
|
||
|
|
L'errore più comune. Controlla queste differenze tra ciò che il tuo provider si aspetta e ciò che SnapOtter invia:
|
||
|
|
|
||
|
|
- `http` contro `https` - lo schema deve corrispondere esattamente
|
||
|
|
- Barra finale - alcuni provider sono rigorosi su questo
|
||
|
|
- Numero di porta - includi la porta se non è standard
|
||
|
|
- Percorso - deve essere `/api/auth/oidc/callback`
|
||
|
|
|
||
|
|
Ricontrolla `EXTERNAL_URL`. Deve corrispondere all'URL che gli utenti digitano nel browser.
|
||
|
|
|
||
|
|
### UNABLE_TO_VERIFY_LEAF_SIGNATURE {#unable-to-verify-leaf-signature}
|
||
|
|
|
||
|
|
Il provider OIDC utilizza un certificato di cui Node.js non si fida. Vedi [Certificati autofirmati](#self-signed-certificates) qui sopra.
|
||
|
|
|
||
|
|
### Errori di scarto dell'orologio {#clock-skew-errors}
|
||
|
|
|
||
|
|
Se l'orologio del tuo server e quello del provider OIDC non sono sincronizzati, la validazione del token potrebbe fallire. Aumenta `OIDC_CLOCK_TOLERANCE` (il valore predefinito è 30 secondi). Una soluzione migliore è eseguire NTP su entrambe le macchine.
|
||
|
|
|
||
|
|
### "OIDC provider unreachable" {#oidc-provider-unreachable}
|
||
|
|
|
||
|
|
SnapOtter recupera il documento di discovery del provider all'avvio e durante il login. Controlla:
|
||
|
|
|
||
|
|
- La risoluzione DNS dall'interno del container Docker (`docker exec snapotter nslookup auth.example.com`)
|
||
|
|
- Le regole del firewall tra il container e il provider
|
||
|
|
- Il valore `OIDC_ISSUER_URL` - deve essere raggiungibile dal server, non solo dal tuo browser
|
||
|
|
|
||
|
|
### Claim mancanti {#missing-claims}
|
||
|
|
|
||
|
|
Se username o email sono vuoti dopo il login, il tuo provider potrebbe non restituire i claim attesi. Verifica:
|
||
|
|
|
||
|
|
- Gli scope configurati in `OIDC_SCOPES` includono `profile` e `email`
|
||
|
|
- Il provider è configurato per includere nel token ID il claim specificato in `OIDC_USERNAME_CLAIM`
|
||
|
|
- Alcuni provider richiedono una configurazione esplicita di mapper/scope per rilasciare i claim
|