# 31 - OIDC Config Examples

Configuration examples for integrating with different OIDC (OpenID Connect) providers. One OIDC provider per instance.

## Table of Contents

1. [General OIDC Configuration](#general-oidc-configuration)
2. [Authentik](#authentik)
3. [Authelia](#authelia)
4. [KeyCloak](#keycloak)
5. [Troubleshooting](#troubleshooting)

## General OIDC Configuration

To enable OIDC, set these environment variables:

```bash
# Enable OIDC
OXICLOUD_OIDC_ENABLED=true

# OIDC provider configuration
OXICLOUD_OIDC_PROVIDER_NAME="Display Name"
OXICLOUD_OIDC_ISSUER_URL="https://provider.example.com/realms/your-realm"
OXICLOUD_OIDC_CLIENT_ID="your-client-id"
OXICLOUD_OIDC_CLIENT_SECRET="your-client-secret"
OXICLOUD_OIDC_REDIRECT_URI="https://your-oxicloud.example.com/api/auth/oidc/callback"
OXICLOUD_OIDC_SCOPES="openid profile email"
OXICLOUD_OIDC_FRONTEND_URL="https://your-oxicloud.example.com"
OXICLOUD_OIDC_AUTO_PROVISION="true"
OXICLOUD_OIDC_ADMIN_GROUPS="admin-group"
OXICLOUD_OIDC_DISABLE_PASSWORD_LOGIN="false"
```

## Authentik

[Authentik](https://goauthentik.io/) is an open-source identity platform providing authentication, authorization, and user management.

### 1. Create an Application in Authentik

1. Log into the Authentik admin panel
2. Go to "Applications" -> "Create"
3. Enter a name for the application (e.g. "OxiCloud")
4. Select "OAuth2/OpenID Provider" as the provider type
5. In the OAuth2 configuration:
   - **Redirect URI/Callback URL**: `https://your-oxicloud.example.com/api/auth/oidc/callback`
   - **Client Type**: Confidential
   - **Client ID**: auto-generated (note it down)
   - **Client Secret**: auto-generated (note it down)
   - **Scopes**: openid, email, profile
6. In the UI configuration:
   - **Launch URL**: `https://your-oxicloud.example.com/`
   - **Icon**: optional

### 2. Configure for Authentik

```yaml
# docker-compose.yml
version: '3'
services:
  oxicloud:
    image: diocrafts/oxicloud:latest
    environment:
      OXICLOUD_OIDC_ENABLED: "true"
      OXICLOUD_OIDC_PROVIDER_NAME: "Authentik"
      OXICLOUD_OIDC_ISSUER_URL: "https://authentik.example.com/application/o/oxicloud"
      OXICLOUD_OIDC_CLIENT_ID: "your-authentik-client-id"
      OXICLOUD_OIDC_CLIENT_SECRET: "your-authentik-client-secret"
      OXICLOUD_OIDC_REDIRECT_URI: "https://oxicloud.example.com/api/auth/oidc/callback"
      OXICLOUD_OIDC_SCOPES: "openid profile email"
      OXICLOUD_OIDC_FRONTEND_URL: "https://oxicloud.example.com"
      OXICLOUD_OIDC_AUTO_PROVISION: "true"
      OXICLOUD_OIDC_ADMIN_GROUPS: ""
      OXICLOUD_OIDC_DISABLE_PASSWORD_LOGIN: "false"
    ports:
      - "8086:8086"
    volumes:
      - ./storage:/app/storage
```

## Authelia

[Authelia](https://www.authelia.com/) is an open-source multi-factor authentication solution.

### 1. Configure Authelia

Edit your Authelia configuration (`configuration.yml`):

```yaml
identity_providers:
  oidc:
    hmac_secret: your-secure-secret  # Change to a secure random value
    issuer_private_key: /config/private.pem  # Path to your private key
    cors:
      endpoints: ['authorization', 'token', 'revocation', 'introspection']
      allowed_origins:
        - https://oxicloud.example.com
    clients:
      - id: oxicloud
        description: OxiCloud
        secret: your-secure-client-secret  # Change this
        public: false
        authorization_policy: two_factor
        redirect_uris:
          - https://oxicloud.example.com/api/auth/oidc/callback
        scopes: ['openid', 'profile', 'email', 'groups']
        userinfo_signing_algorithm: none
```

### 2. Configure for Authelia

```yaml
# docker-compose.yml
version: '3'
services:
  oxicloud:
    image: diocrafts/oxicloud:latest
    environment:
      OXICLOUD_OIDC_ENABLED: "true"
      OXICLOUD_OIDC_PROVIDER_NAME: "Authelia"
      OXICLOUD_OIDC_ISSUER_URL: "https://authelia.example.com"
      OXICLOUD_OIDC_CLIENT_ID: "oxicloud"
      OXICLOUD_OIDC_CLIENT_SECRET: "your-secure-client-secret"
      OXICLOUD_OIDC_REDIRECT_URI: "https://oxicloud.example.com/api/auth/oidc/callback"
      OXICLOUD_OIDC_SCOPES: "openid profile email groups"
      OXICLOUD_OIDC_FRONTEND_URL: "https://oxicloud.example.com"
      OXICLOUD_OIDC_AUTO_PROVISION: "true"
      OXICLOUD_OIDC_ADMIN_GROUPS: ""
      OXICLOUD_OIDC_DISABLE_PASSWORD_LOGIN: "false"
    ports:
      - "8086:8086"
    volumes:
      - ./storage:/app/storage
```

## KeyCloak

[KeyCloak](https://www.keycloak.org/) is an open-source identity and access management solution.

### 1. Create a Client in KeyCloak

1. Log into the KeyCloak admin console
2. Select your Realm
3. Go to "Clients" -> "Create"
4. Fill in the form:
   - **Client ID**: `oxicloud`
   - **Client Protocol**: `openid-connect`
   - **Root URL**: `https://oxicloud.example.com`
5. In the client configuration:
   - **Access Type**: `confidential`
   - **Valid Redirect URIs**: `https://oxicloud.example.com/api/auth/oidc/callback`
   - **Web Origins**: `https://oxicloud.example.com` (or `+` to allow all origins)
6. Save the configuration
7. Go to the "Credentials" tab and copy the generated "Secret"

### 2. Configure for KeyCloak

```yaml
# docker-compose.yml
version: '3'
services:
  oxicloud:
    image: diocrafts/oxicloud:latest
    environment:
      OXICLOUD_OIDC_ENABLED: "true"
      OXICLOUD_OIDC_PROVIDER_NAME: "KeyCloak"
      OXICLOUD_OIDC_ISSUER_URL: "https://keycloak.example.com/realms/your-realm"
      OXICLOUD_OIDC_CLIENT_ID: "oxicloud"
      OXICLOUD_OIDC_CLIENT_SECRET: "your-keycloak-client-secret"
      OXICLOUD_OIDC_REDIRECT_URI: "https://oxicloud.example.com/api/auth/oidc/callback"
      OXICLOUD_OIDC_SCOPES: "openid profile email"
      OXICLOUD_OIDC_FRONTEND_URL: "https://oxicloud.example.com"
      OXICLOUD_OIDC_AUTO_PROVISION: "true"
      OXICLOUD_OIDC_ADMIN_GROUPS: "oxicloud-admins"
      OXICLOUD_OIDC_DISABLE_PASSWORD_LOGIN: "false"
    ports:
      - "8086:8086"
    volumes:
      - ./storage:/app/storage
```

## Troubleshooting

### Error: "Failed to discover OIDC provider"

The backend cannot reach the provider's discovery endpoint.

**Fixes:**
1. Verify the discovery URL is correct
2. Check that the backend can reach the URL (firewalls, DNS, etc.)
3. If using a self-signed certificate, configure the appropriate trust

### Error: "Invalid redirect URI"

The OIDC provider is rejecting the redirect URI.

**Fixes:**
1. Make sure the redirect URI configured in the backend matches exactly what is registered in the provider
2. Check for protocol differences (http vs https), port, or path mismatches

### Error: "User does not exist and auto-creation is disabled"

**Fixes:**
1. Enable auto-provisioning: `OXICLOUD_OIDC_AUTO_PROVISION="true"`
2. Or manually create the user before attempting OIDC login

### Error: "Could not extract user ID from claim"

The backend cannot find the user ID attribute in the token claims.

**Fixes:**
1. Verify the provider returns the `sub` claim in tokens
2. Make sure scopes in **OXICLOUD_OIDC_SCOPES** include `openid`
3. Configure the provider to include the required claims in tokens

See `oidc-architecture.md` and `oidc-integration.md` for deeper technical details.
