> ## Documentation Index
> Fetch the complete documentation index at: https://ayakaleaf-pro.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# OIDC-autentisering

<Info>
  Den här funktionen har utvecklats av [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). Här tillhandahåller vi viss dokumentation för din konfiguration.
</Info>

### Konfiguration

Internt använder Overleafs OIDC-modul biblioteket [passport-openidconnect](https://github.com/jaredhanson/passport-openidconnect). Om du har problem med att konfigurera OpenID Connect är det värt att läsa README-filen för `passport-openidconnect` för att få en känsla för vilken konfiguration den förväntar sig.

Miljövariabeln `EXTERNAL_AUTH` krävs för att aktivera OIDC-autentiseringsmodulen. Den här miljövariabeln anger vilka externa autentiseringsmetoder som aktiveras. Variabelns värde är en lista. Om listan innehåller `oidc` aktiveras OIDC-autentisering.

Till exempel: `EXTERNAL_AUTH=ldap oidc`

När OIDC-autentiseringsmetoden används omdirigeras användaren till identitetsleverantörens (IdP) autentiseringssida. Om IdP:n autentiserar användaren kontrolleras Overleafs användardatabas efter en post som innehåller ett `thirdPartyIdentifiers`-fält med följande struktur:

```text theme={null}
thirdPartyIdentifiers: [
  {
    externalUserId: "...",
    externalData: null,
    providerId: "..."
  }
]
```

`externalUserId` måste matcha användar-ID:t i profilen som returneras av IdP-servern (se miljövariabeln `OVERLEAF_OIDC_USER_ID_FIELD`), och `providerId` måste matcha OIDC-leverantörens ID (se `OVERLEAF_OIDC_PROVIDER_ID`).

Om ingen matchande post hittas söks databasen igenom efter en användare vars primära e-postadress matchar e-postadressen i IdP:ns användarprofil:

* Om en sådan användare hittas uppdateras fältet `thirdPartyIdentifiers`.
* Om ingen matchande användare hittas och JIT-kontoskapande inte är inaktiverat skapas en ny användare med e-postadressen och `thirdPartyIdentifiers` från IdP-profilen.

I båda fallen sägs användaren vara ”länkad” till den externa OIDC-användaren. Användaren kan avlänkas från OIDC-leverantören på sidan `/user/settings`.

#### Hitta värdena med discovery-dokumentet

Varje OpenID-leverantör (OP) publicerar ett discovery-dokument på `<issuer>/.well-known/openid-configuration`. Kopiera värdena därifrån i stället för att skriva in dem för hand; ett enda felaktigt tecken räcker för att inloggningen ska sluta fungera.

<Steps>
  <Step title="Hitta discovery-URL:en">
    Din OP visar den på sidan för klienten (leverantören) som du skapade för Overleaf. Öppna **Applications > Providers** i Authentik, välj leverantören och leta efter **OpenID Configuration URL** och **OpenID Configuration Issuer**:

    <Frame caption="Authentik: discovery-URL:en och utfärdaren för en leverantör (testinstans)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/oidc-authentik-provider.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=e3cb5603d959665472b53e39b58b2775" alt="" width="1280" height="633" data-path="images/on-premises/oidc-authentik-provider.png" />
    </Frame>

    URL:en ser oftast ut så här:

    * Keycloak: `https://keycloak.example.com/realms/<realm>/.well-known/openid-configuration`
    * Authentik: `https://authentik.example.com/application/o/<application-slug>/.well-known/openid-configuration`
  </Step>

  <Step title="Läs av värdena">
    Öppna URL:en i en webbläsare, eller kör på Overleaf-servern:

    ```shell theme={null}
    curl -s https://authentik.example.com/application/o/overleaf/.well-known/openid-configuration \
      | jq '{issuer, authorization_endpoint, token_endpoint, userinfo_endpoint, end_session_endpoint}'
    ```

    Svaret från Authentik ser ut så här:

    ```json theme={null}
    {
      "issuer": "https://authentik.example.com/application/o/overleaf/",
      "authorization_endpoint": "https://authentik.example.com/application/o/authorize/",
      "token_endpoint": "https://authentik.example.com/application/o/token/",
      "userinfo_endpoint": "https://authentik.example.com/application/o/userinfo/",
      "end_session_endpoint": "https://authentik.example.com/application/o/overleaf/end-session/"
    }
    ```

    Authentik listar även dessa URL:er längre ned på leverantörssidan:

    <Frame caption="Authentik: endpointerna för en leverantör (testinstans)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/oidc-authentik-endpoints.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=55d130cbbbf27fd11aebafa1ab3f090c" alt="" width="1280" height="633" data-path="images/on-premises/oidc-authentik-endpoints.png" />
    </Frame>
  </Step>

  <Step title="Kopiera in dem i `variables.env`">
    | Fält i discovery-dokumentet | Miljövariabel |
    | - | - |
    | `issuer` | `OVERLEAF_OIDC_ISSUER` |
    | `authorization_endpoint` | `OVERLEAF_OIDC_AUTHORIZATION_URL` |
    | `token_endpoint` | `OVERLEAF_OIDC_TOKEN_URL` |
    | `userinfo_endpoint` | `OVERLEAF_OIDC_USER_INFO_URL` |
    | `end_session_endpoint` | `OVERLEAF_OIDC_LOGOUT_URL` |

    ```dotenv theme={null}
    OVERLEAF_OIDC_ISSUER=https://authentik.example.com/application/o/overleaf/
    OVERLEAF_OIDC_AUTHORIZATION_URL=https://authentik.example.com/application/o/authorize/
    OVERLEAF_OIDC_TOKEN_URL=https://authentik.example.com/application/o/token/
    OVERLEAF_OIDC_USER_INFO_URL=https://authentik.example.com/application/o/userinfo/
    OVERLEAF_OIDC_LOGOUT_URL=https://authentik.example.com/application/o/overleaf/end-session/
    ```
  </Step>

  <Step title="Kontrollera att Overleaf kan nå OP:n">
    Overleaf anropar token- och userinfo-endpointerna inifrån sin container, så OP:n måste vara nåbar därifrån, inte bara från din webbläsare:

    ```shell theme={null}
    docker exec sharelatex curl -sS -o /dev/null -w "%{http_code}\n" \
      https://authentik.example.com/application/o/overleaf/.well-known/openid-configuration
    ```

    Det ska skriva ut `200`.
  </Step>
</Steps>

<Warning>
  Kopiera `issuer` exakt, inklusive det avslutande snedstrecket. Overleaf jämför det tecken för tecken med utfärdaren i ID-token; varje skillnad gör att varje OIDC-inloggning misslyckas med:

  `{"message":{"message":"ID token not issued by expected OpenID provider."}}`

  I Authentik hör utfärdaren till applikationen (`.../application/o/<application-slug>/`). Det är inte adressen till Authentik-servern, även om authorize-, token- och userinfo-URL:erna delas av alla applikationer.
</Warning>

#### Miljövariabler

Värdena för följande fem obligatoriska variabler kan hittas via endpointen `.well-known/openid-configuration` hos din OpenID-leverantör (OP), se ovan.

* `OVERLEAF_OIDC_ISSUER` <strong>(obligatorisk)</strong>
* `OVERLEAF_OIDC_AUTHORIZATION_URL` <strong>(obligatorisk)</strong>
* `OVERLEAF_OIDC_TOKEN_URL` <strong>(obligatorisk)</strong>
* `OVERLEAF_OIDC_USER_INFO_URL` <strong>(obligatorisk)</strong>
* `OVERLEAF_OIDC_LOGOUT_URL` <strong>(obligatorisk)</strong>

Värdena för följande två obligatoriska variabler tillhandahålls av administratören för din OP

* `OVERLEAF_OIDC_CLIENT_ID` <strong>(obligatorisk)</strong>
* `OVERLEAF_OIDC_CLIENT_SECRET` <strong>(obligatorisk)</strong>
* `OVERLEAF_OIDC_SCOPE`
  * Standard: `openid profile email`
* `OVERLEAF_OIDC_PROVIDER_ID`
  * Godtyckligt ID för OP:n, standardvärdet är `oidc`.
* `OVERLEAF_OIDC_PROVIDER_NAME`
  * Namnet på OP:n, som används i avsnittet `Linked Accounts` på sidan `/user/settings`, standardvärdet är `OIDC Provider`.
* `OVERLEAF_OIDC_IDENTITY_SERVICE_NAME`
  * Visningsnamn för identitetstjänsten, som används på inloggningssidan (standard: `Log in with $OVERLEAF_OIDC_PROVIDER_NAME`).
* `OVERLEAF_OIDC_PROVIDER_DESCRIPTION`
  * Beskrivning av OP:n, som används i avsnittet `Linked Accounts` (standard: `Log in with $OVERLEAF_OIDC_PROVIDER_NAME`).
* `OVERLEAF_OIDC_PROVIDER_INFO_LINK`
  * URL för `Learn more` i OP-beskrivningen; som standard finns ingen `Learn more`-länk i beskrivningen.
* `OVERLEAF_OIDC_PROVIDER_HIDE_NOT_LINKED`
  * Visa inte OP:n på sidan `/user/settings` om användarens konto inte är länkat till OP:n, standard `false`.
* `OVERLEAF_OIDC_USER_ID_FIELD`
  * Värdet på det här attributet används av Overleaf som externt användar-ID, standardvärdet är `id`. Andra rimliga värden är `email` och `username` (motsvarar OIDC-anspråket `preferred_username`).
* `OVERLEAF_OIDC_ALLOWED_EMAIL_DOMAINS`
  * Begränsar Just-in-Time-kontoskapande (JIT) för användare som autentiseras via OIDC. Om variabeln sätts till en kommaseparerad lista med domännamn skapas ett nytt konto endast om domänen i användarens e-postadress matchar någon av de listade domänerna. Om domänen inte matchar måste en administratör manuellt skapa användarkontot med OIDC-användarens e-postadress, antingen med ett starkt slumpmässigt lösenord eller, helst, helt utan fältet `hashedPassword`. Domännamn kan inledas med jokertecknet `*.` för att matcha underdomäner.
    * Exempel: För att tillåta JIT-kontoskapande för användare med e-postadresser som `name@example.com` och `name@math.example.com`:\
      `OVERLEAF_OIDC_ALLOWED_EMAIL_DOMAINS=example.com, *.example.com`
    * Exempel: För att helt inaktivera JIT-kontoskapande:\
      `OVERLEAF_OIDC_ALLOWED_EMAIL_DOMAINS=`
* `OVERLEAF_OIDC_UPDATE_USER_DETAILS_ON_LOGIN`
  * Om den sätts till `true` uppdateras användarens fält `first_name` och `last_name` vid inloggning, och formuläret för användaruppgifter på sidan `/user/settings` inaktiveras.
* `OVERLEAF_OIDC_IS_ADMIN_FIELD` och `OVERLEAF_OIDC_IS_ADMIN_FIELD_VALUE`
  * När båda miljövariablerna är satta uppdaterar inloggningsprocessen `user.isAdmin = true` om profilen som returneras av OP:n innehåller attributet som anges av `OVERLEAF_OIDC_IS_ADMIN_FIELD` och dess värde antingen matchar `OVERLEAF_OIDC_IS_ADMIN_FIELD_VALUE` eller är en array som innehåller `OVERLEAF_OIDC_IS_ADMIN_FIELD_VALUE` (till exempel claimet `groups`); annars sätts `user.isAdmin` till `false`. Om `OVERLEAF_OIDC_IS_ADMIN_FIELD` är `email` används värdet av attributet `emails[0].value` vid matchningskontrollen.

Omdirigerings-URL:en för din OpenID-leverantör är `https://my-overleaf-instance.com/oidc/login/callback`.

<Accordion title="Exempel på variables.env-fil">
  ```dotenv title="variables.env" wrap theme={null}
  OVERLEAF_APP_NAME="Our Overleaf Instance"

  ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

  # Enables Thumbnail generation using ImageMagick
  ENABLE_CONVERSIONS=true

  # Disables email confirmation requirement
  EMAIL_CONFIRMATION_DISABLED=true

  ## Nginx
  # NGINX_WORKER_PROCESSES=4
  # NGINX_WORKER_CONNECTIONS=768

  ## Set for TLS via nginx-proxy
  # OVERLEAF_BEHIND_PROXY=true
  # OVERLEAF_SECURE_COOKIE=true

  OVERLEAF_SITE_URL=http://my-overleaf-instance.com
  OVERLEAF_NAV_TITLE=Our Overleaf Instance
  # OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
  OVERLEAF_ADMIN_EMAIL=support@example.com

  OVERLEAF_LEFT_FOOTER=[{"text": "Contact your support team", "url": "mailto:support@example.com"}]
  OVERLEAF_RIGHT_FOOTER=[{"text":"Hello, I am on the Right", "url":"https://github.com/yu-i-i/overleaf-cep"}]

  OVERLEAF_EMAIL_FROM_ADDRESS=team@example.com
  OVERLEAF_EMAIL_SMTP_HOST=smtp.example.com
  OVERLEAF_EMAIL_SMTP_PORT=587
  OVERLEAF_EMAIL_SMTP_SECURE=false
  # OVERLEAF_EMAIL_SMTP_USER=
  # OVERLEAF_EMAIL_SMTP_PASS=
  # OVERLEAF_EMAIL_SMTP_NAME=
  OVERLEAF_EMAIL_SMTP_LOGGER=false
  OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
  OVERLEAF_EMAIL_SMTP_IGNORE_TLS=false
  OVERLEAF_CUSTOM_EMAIL_FOOTER=This system is run by department x

  OVERLEAF_PROXY_LEARN=true
  NAV_HIDE_POWERED_BY=true

  #################
  ## OIDC for CE ##
  #################

  EXTERNAL_AUTH=oidc

  OVERLEAF_OIDC_PROVIDER_ID=oidc
  OVERLEAF_OIDC_ISSUER=https://keycloak.provider.com/realms/example
  OVERLEAF_OIDC_AUTHORIZATION_URL=https://keycloak.provider.com/realms/example/protocol/openid-connect/auth
  OVERLEAF_OIDC_TOKEN_URL=https://keycloak.provider.com/realms/example/protocol/openid-connect/token
  OVERLEAF_OIDC_USER_INFO_URL=https://keycloak.provider.com/realms/example/protocol/openid-connect/userinfo
  OVERLEAF_OIDC_LOGOUT_URL=https://keycloak.provider.com/realms/example/protocol/openid-connect/logout
  OVERLEAF_OIDC_CLIENT_ID=Overleaf-OIDC
  OVERLEAF_OIDC_CLIENT_SECRET=DoNotUseThisATGgaAcTgCcATgGATTACAagGtTCaGcGTAG
  OVERLEAF_OIDC_IDENTITY_SERVICE_NAME='Log in with Keycloak OIDC Provider'
  OVERLEAF_OIDC_PROVIDER_NAME=OIDC Keycloak Provider
  OVERLEAF_OIDC_PROVIDER_INFO_LINK=https://openid.net
  OVERLEAF_OIDC_IS_ADMIN_FIELD=email
  OVERLEAF_OIDC_IS_ADMIN_FIELD_VALUE=overleaf.admin@example.com
  OVERLEAF_OIDC_UPDATE_USER_DETAILS_ON_LOGIN=false
  ```
</Accordion>

## Steg för steg: goauthentik

Här går vi igenom en konfiguration som har testats mot [goauthentik](https://goauthentik.io/). Ersätt `https://overleaf.example.com` med din `OVERLEAF_SITE_URL` och `https://authentik.example.com` med adressen till din Authentik.

<Steps>
  <Step title="Skapa leverantören">
    Öppna **Applications > Providers** i Authentik, klicka på **New Provider**, välj **OAuth2/OpenID Provider** och klicka på **Next**.

    * **Client Type**: `Confidential`.
    * **Redirect URIs** (under **Protocol settings**): lägg till `https://overleaf.example.com/oidc/login/callback` med matchningsläget `Strict`.
    * Kopiera **Client ID** och **Client Secret** nu, till `OVERLEAF_OIDC_CLIENT_ID` och `OVERLEAF_OIDC_CLIENT_SECRET`.

    <Frame caption="Authentik: Client ID och Client Secret för en ny leverantör">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/oidc-authentik-create.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=f127a92eaf3063714e9af515fe97c263" alt="" width="1120" height="808" data-path="images/on-premises/oidc-authentik-create.png" />
    </Frame>

    <Warning>
      Authentik visar klienthemligheten endast medan du skapar leverantören. Senare erbjuder redigeringsformuläret bara **Modify**, som ersätter hemligheten med en ny.
    </Warning>
  </Step>

  <Step title="Skapa applikationen">
    Öppna **Applications > Applications**, skapa en ny applikation, ge den ett namn och en slug, till exempel `overleaf`, och välj leverantören. Slugen blir en del av utfärdaren: `https://authentik.example.com/application/o/overleaf/`.
  </Step>

  <Step title="Kopiera URL:erna">
    Följ [Hitta värdena med discovery-dokumentet](#hitta-värdena-med-discovery-dokumentet) ovan för att fylla i de fem URL:erna.
  </Step>

  <Step title="Mappa administratörerna (valfritt)">
    Authentik skickar användarens grupper som claimet `groups`, en array. Så här gör du medlemmarna i Authentik-gruppen `Admins` till administratörer i Overleaf:

    ```dotenv theme={null}
    OVERLEAF_OIDC_IS_ADMIN_FIELD=groups
    OVERLEAF_OIDC_IS_ADMIN_FIELD_VALUE=Admins
    ```

    <Warning>
      Administratörsflaggan uppdateras vid varje OIDC-inloggning. Med fel fält eller värde förlorar varje administratör som loggar in via OIDC sina administratörsrättigheter, inklusive administratören som skapades i Launchpad. Testa mappningen med ett andra administratörskonto först.
    </Warning>
  </Step>
</Steps>

<Accordion title="Testad variables.env för goauthentik">
  ```dotenv title="variables.env" wrap theme={null}
  EXTERNAL_AUTH=oidc
  OVERLEAF_OIDC_PROVIDER_ID=authentik
  OVERLEAF_OIDC_IDENTITY_SERVICE_NAME=Log in with Authentik
  OVERLEAF_OIDC_ISSUER=https://authentik.example.com/application/o/overleaf/
  OVERLEAF_OIDC_AUTHORIZATION_URL=https://authentik.example.com/application/o/authorize/
  OVERLEAF_OIDC_TOKEN_URL=https://authentik.example.com/application/o/token/
  OVERLEAF_OIDC_USER_INFO_URL=https://authentik.example.com/application/o/userinfo/
  OVERLEAF_OIDC_LOGOUT_URL=https://authentik.example.com/application/o/overleaf/end-session/
  OVERLEAF_OIDC_CLIENT_ID=<Client ID>
  OVERLEAF_OIDC_CLIENT_SECRET=<Client Secret>
  OVERLEAF_OIDC_USER_ID_FIELD=username
  OVERLEAF_OIDC_IS_ADMIN_FIELD=groups
  OVERLEAF_OIDC_IS_ADMIN_FIELD_VALUE=Admins
  OVERLEAF_OIDC_UPDATE_USER_DETAILS_ON_LOGIN=true
  ```
</Accordion>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.