> ## 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.

# Autentikasi LDAP

<Info>
  Fitur ini dikembangkan oleh [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). Di sini kami menyediakan beberapa dokumentasi untuk konfigurasi Anda.
</Info>

<Warning>
  Overleaf menggunakan pustaka **passport-ldapauth**, yang relatif sudah usang, sehingga kompatibilitas LDAP tidak dapat dijamin sepenuhnya. Dengan penyedia identitas LDAP tertentu (misalnya, [https://goauthentik.io/](https://goauthentik.io/)), kegagalan login mungkin terjadi. Oleh karena itu, jika memungkinkan, disarankan untuk mengutamakan metode OAuth/SAML. Untuk goauthentik, ikuti [Langkah demi langkah: goauthentik](/id/on-premises/configuration/overleaf-toolkit/authentication/ldap-authentication#langkah-demi-langkah-goauthentik) di bawah, yang telah diuji.
</Warning>

### Apa itu LDAP

LDAP adalah protokol autentikasi yang digunakan untuk verifikasi identitas eksternal. Overleaf Server Pro menyediakan formulir login LDAP khusus di antarmuka web, terpisah dari metode autentikasi standar. Saat pengguna mengirimkan nama pengguna dan kata sandi LDAP mereka, backend Overleaf memverifikasi kredensial tersebut terhadap server LDAP yang dikonfigurasi, misalnya `ldap://ldap:10389`.

<Frame caption="Contoh LDAP pada Server Pro">
  <img src="https://mintcdn.com/ayakaleaf-pro/x9kfDjtWlyyhG_mR/images/on-premises/image-29.png?fit=max&auto=format&n=x9kfDjtWlyyhG_mR&q=85&s=f3ebcacecec45115cf9b1fa55eb1ba94" alt="" width="2804" height="2005" data-path="images/on-premises/image-29.png" />
</Frame>

### Konfigurasi

Secara internal, LDAP Overleaf menggunakan pustaka [passport-ldapauth](https://github.com/vesse/passport-ldapauth). Sebagian besar opsi konfigurasi ini diteruskan ke objek konfigurasi `server` yang digunakan untuk mengonfigurasi `passport-ldapauth`. Jika Anda mengalami masalah saat mengonfigurasi LDAP, ada baiknya membaca README `passport-ldapauth` untuk memahami konfigurasi yang diharapkannya.

Variabel lingkungan `EXTERNAL_AUTH` diperlukan untuk mengaktifkan modul autentikasi LDAP. Variabel lingkungan ini menentukan metode autentikasi eksternal mana yang diaktifkan. Nilai variabel ini berupa daftar. Jika daftar tersebut mencakup `ldap`, autentikasi LDAP akan diaktifkan.

Contoh: `EXTERNAL_AUTH=ldap saml`

Berbeda dengan Overleaf CEP, dalam edisi ayaka-notes kami, autentikasi LDAP dibatasi sebagai metode autentikasi murni, yang tersedia di `http://your-overleaf.com/ldap/login`.

Saat menggunakan metode autentikasi LDAP, pengguna memasukkan `username` dan `password` di formulir login, lalu sistem akan mencoba:

1. Mencari pengguna LDAP di direktori LDAP menggunakan filter yang ditentukan oleh `OVERLEAF_LDAP_SEARCH_FILTER` lalu mengautentikasinya.
2. Jika autentikasi berhasil, database pengguna Overleaf diperiksa untuk mencari pengguna dengan alamat email utama yang cocok dengan alamat email pengguna LDAP yang terautentikasi:
   * Jika pengguna yang cocok ditemukan, field `hashedPassword` untuk pengguna ini dihapus (jika ada). Hal ini memastikan bahwa pengguna hanya dapat login melalui autentikasi LDAP di masa mendatang.
   * Jika tidak ada pengguna yang cocok, pengguna Overleaf baru akan dibuat menggunakan email, nama depan, dan nama belakang yang diambil dari server LDAP.

<Danger>
  Untuk pengguna yang login melalui LDAP, kami tidak menyimpan kata sandi ter-hash (atau menghapus yang sudah ada) di database mongo Overleaf.
</Danger>

#### Variabel Lingkungan

* `OVERLEAF_LDAP_URL` <strong>(wajib)</strong>
  * URL server LDAP.
    * Contoh: `ldaps://ldap.example.com:636` (LDAP melalui SSL)
    * Contoh: `ldap://ldap.example.com:389` (tidak terenkripsi atau STARTTLS, jika dikonfigurasi).
* `OVERLEAF_LDAP_IDENTITY_SERVICE_NAME`
  * Nama tampilan untuk layanan identitas LDAP, digunakan di halaman login.
  * Default-nya `Log in with LDAP Provider`.
* `OVERLEAF_LDAP_EMAIL_ATT`
  * Atribut email yang dikembalikan oleh server LDAP, default `mail`. Setiap pengguna LDAP harus memiliki setidaknya satu alamat email. Jika beberapa alamat diberikan, hanya alamat pertama yang akan digunakan.
* `OVERLEAF_LDAP_FIRST_NAME_ATT`
  * Nama properti yang menyimpan nama depan pengguna yang digunakan dalam aplikasi, biasanya `givenName`.
* `OVERLEAF_LDAP_LAST_NAME_ATT`
  * Nama properti yang menyimpan nama keluarga pengguna yang digunakan dalam aplikasi, biasanya `sn`.
* `OVERLEAF_LDAP_NAME_ATT`
  * Nama properti yang menyimpan nama lengkap pengguna, biasanya `cn`. Jika salah satu dari dua variabel sebelumnya tidak didefinisikan, nama depan dan/atau nama belakang pengguna diambil dari variabel ini. Jika tidak, variabel ini tidak digunakan.
* `OVERLEAF_LDAP_PLACEHOLDER`
  * Placeholder untuk formulir login, default-nya `Username`.
* `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
  * Jika diatur ke `true`, field `first_name` dan `last_name` pengguna LDAP akan diperbarui saat login, dan formulir detail pengguna di halaman `/user/settings` dinonaktifkan untuk pengguna LDAP. Jika tidak, detail hanya akan diambil saat login pertama.
* `OVERLEAF_LDAP_BIND_DN`
  * Distinguished name dari pengguna LDAP yang akan digunakan untuk koneksi LDAP (pengguna ini harus dapat mencari/menampilkan daftar akun di server LDAP), misalnya `cn=ldap_reader,dc=example,dc=com`. Jika tidak didefinisikan, binding anonim akan digunakan.
* `OVERLEAF_LDAP_BIND_CREDENTIALS`
  * Kata sandi untuk `OVERLEAF_LDAP_BIND_DN`.
* `OVERLEAF_LDAP_BIND_PROPERTY`
  * Properti pengguna yang digunakan untuk bind terhadap klien, default-nya `dn`.
* `OVERLEAF_LDAP_SEARCH_BASE` <strong>(wajib)</strong>
  * Base DN tempat memulai pencarian pengguna. Misalnya, `ou=people,dc=example,dc=com`.
* `OVERLEAF_LDAP_SEARCH_FILTER`
  * Filter pencarian LDAP untuk menemukan pengguna. Gunakan literal '\{\{username}}' agar nama pengguna yang diberikan disisipkan ke dalam pencarian LDAP.
    * Contoh: `(|(uid={{username}})(mail={{username}}))` (pengguna dapat login dengan email atau nama login).
    * Contoh: `(sAMAccountName={{username}})` (Active Directory).
* `OVERLEAF_LDAP_SEARCH_SCOPE`
  * Cakupan pencarian dapat berupa `base`, `one`, atau `sub` (default).
* `OVERLEAF_LDAP_SEARCH_ATTRIBUTES`
  * Array JSON berisi atribut yang akan diambil dari server LDAP, misalnya `["uid", "mail", "givenName", "sn"]`. Secara default, semua atribut diambil.
* `OVERLEAF_LDAP_STARTTLS`
  * Jika `true`, LDAP melalui TLS akan digunakan.
* `OVERLEAF_LDAP_TLS_OPTS_CA_PATH`
  * Path ke file yang berisi sertifikat CA yang digunakan untuk memverifikasi sertifikat SSL/TLS server LDAP. Jika ada beberapa sertifikat, nilainya dapat berupa array JSON berisi path ke sertifikat-sertifikat tersebut. File harus dapat diakses oleh container docker.
    * Contoh (satu sertifikat): `/var/lib/overleaf/certs/ldap_ca_cert.pem`
    * Contoh (beberapa sertifikat): `["/var/lib/overleaf/certs/ldap_ca_cert1.pem", "/var/lib/overleaf/certs/ldap_ca_cert2.pem"]`
* `OVERLEAF_LDAP_TLS_OPTS_REJECT_UNAUTH`
  * Jika `true`, sertifikat server diverifikasi terhadap daftar CA yang diberikan.
* `OVERLEAF_LDAP_CACHE`
  * Jika `true`, hingga 100 kredensial sekaligus akan di-cache selama 5 menit.
* `OVERLEAF_LDAP_TIMEOUT`
  * Berapa lama klien membiarkan operasi berjalan sebelum timeout, dalam ms (Default: Infinity).
* `OVERLEAF_LDAP_CONNECT_TIMEOUT`
  * Berapa lama klien harus menunggu sebelum timeout pada koneksi TCP, dalam ms (Default: default OS).
* `OVERLEAF_LDAP_IS_ADMIN_ATT` dan `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`
  * Jika kedua variabel lingkungan ini diatur, proses login akan memperbarui `user.isAdmin = true` jika profil LDAP berisi atribut yang ditentukan oleh `OVERLEAF_LDAP_IS_ADMIN_ATT` dan nilainya cocok dengan `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE` atau berupa array yang berisi `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`; jika tidak, `user.isAdmin` diatur ke `false`. Jika salah satu variabel ini tidak diatur, status admin hanya diatur ke `true` saat pembuatan pengguna admin di Launchpad.

Lima variabel berikut digunakan untuk mengonfigurasi cara pengambilan kontak pengguna dari server LDAP.

* `OVERLEAF_LDAP_CONTACTS_FILTER`
  * Filter yang digunakan untuk mencari pengguna di server LDAP yang akan dimuat ke dalam kontak. Placeholder '\{\{userProperty}}' di dalam filter diganti dengan nilai properti yang ditentukan oleh `OVERLEAF_LDAP_CONTACTS_PROPERTY` dari pengguna LDAP yang memulai pencarian. Jika tidak didefinisikan, tidak ada pengguna yang diambil dari server LDAP ke dalam kontak.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_BASE`
  * Menentukan base DN tempat memulai pencarian kontak. Default-nya `OVERLEAF_LDAP_SEARCH_BASE`.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_SCOPE`
  * Cakupan pencarian dapat berupa `base`, `one`, atau `sub` (default).
* `OVERLEAF_LDAP_CONTACTS_PROPERTY`
  * Menentukan properti objek pengguna yang akan menggantikan placeholder '\{\{userProperty}}' di `OVERLEAF_LDAP_CONTACTS_FILTER`.
* `OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE`
  * Menentukan nilai `OVERLEAF_LDAP_CONTACTS_PROPERTY` jika pencarian dimulai oleh pengguna non-LDAP. Jika variabel ini tidak didefinisikan, filter yang dihasilkan tidak akan cocok dengan apa pun. Nilai `*` dapat digunakan sebagai wildcard.

<Accordion title="Contoh">
  ```text theme={null}
  OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
  OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
  OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE=1000
  ```

  Contoh di atas akan memuat ke dalam kontak pengguna LDAP saat ini semua pengguna LDAP yang memiliki UNIX `gid` yang sama. Pengguna non-LDAP akan memiliki semua pengguna LDAP dengan UNIX `gid=1000` di dalam kontak mereka.
</Accordion>

<Accordion title="Contoh file variables.env">
  ```text 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

  #################
  ## LDAP for CE ##
  #################

  EXTERNAL_AUTH=ldap
  OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
  OVERLEAF_LDAP_STARTTLS=true
  OVERLEAF_LDAP_TLS_OPTS_CA_PATH=/var/lib/overleaf/certs/ldap_ca_cert.pem
  OVERLEAF_LDAP_SEARCH_BASE=ou=people,dc=example,dc=com
  OVERLEAF_LDAP_SEARCH_FILTER=(|(uid={{username}})(mail={{username}}))
  OVERLEAF_LDAP_BIND_DN=cn=ldap_reader,dc=example,dc=com
  OVERLEAF_LDAP_BIND_CREDENTIALS=GoodNewsEveryone
  OVERLEAF_LDAP_EMAIL_ATT=mail
  OVERLEAF_LDAP_FIRST_NAME_ATT=givenName
  OVERLEAF_LDAP_LAST_NAME_ATT=sn
  # OVERLEAF_LDAP_NAME_ATT=cn
  OVERLEAF_LDAP_SEARCH_ATTRIBUTES=["uid", "sn", "givenName", "mail"]

  OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN=true

  OVERLEAF_LDAP_PLACEHOLDER='Username or email address'

  OVERLEAF_LDAP_IS_ADMIN_ATT=mail
  OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=admin@example.com

  OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
  OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
  OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE='*'
  ```
</Accordion>

## Langkah demi langkah: goauthentik

Panduan ini menjelaskan penyiapan yang telah diuji dengan [goauthentik](https://goauthentik.io/). Contoh-contoh menggunakan Base DN `dc=example,dc=com`; ganti dengan milik Anda.

<Steps>
  <Step title="Buat akun bind">
    Overleaf terlebih dahulu masuk ke direktori dengan akunnya sendiri untuk menemukan pengguna. Di Authentik, buka **Directory > Users**, klik **New User**, pilih **Internal User**, lalu klik **Next**. Masukkan nama pengguna, misalnya `ldapservice`, lalu klik **Create**:

    <Frame caption="Authentik: membuat akun bind">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-user-create.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=bf5d9a5aefd048781339157121a9e203" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-user-create.png" />
    </Frame>

    Buka pengguna baru tersebut dan klik **Set password**. Kata sandi ini dimasukkan ke `OVERLEAF_LDAP_BIND_CREDENTIALS`:

    <div style={{ textAlign: "center" }}>
      <Frame caption="Authentik: mengatur kata sandi akun bind (instans uji)">
        <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-user-page.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=96aad0f919dc8e74fef5995b1dde1e78" alt="" width="207" data-path="images/on-premises/ldap-authentik-user-page.png" />
      </Frame>
    </div>

    Catat nomor pengguna di bilah alamat, misalnya `19` pada `…/#/identity/users/19`. Anda memerlukannya di langkah 3.
  </Step>

  <Step title="Buat provider dan aplikasi">
    Buka **Applications > Applications** dan klik **New Application**. Wizard akan membuat aplikasi beserta provider-nya sekaligus.

    1\. Beri aplikasi nama dan slug, misalnya `overleaf-ldap`, lalu klik **Next**:

    <Frame caption="Authentik: nama dan slug aplikasi">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-app.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=0d3e6b54e9bf552bd81d8b1d6b722701" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-app.png" />
    </Frame>

    2\. Pilih **LDAP Provider** dan klik **Next**:

    <Frame caption="Authentik: memilih provider LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-type.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=ee63f2682051572a08c1f5bc321a1af6" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-type.png" />
    </Frame>

    3\. Atur **Bind Mode** ke **Direct binding** dan **Search Mode** ke **Direct querying**:

    <Frame caption="Authentik: mode bind dan mode pencarian provider LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-modes.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=ea147f1605e76142021d07f775d5ef53" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-modes.png" />
    </Frame>

    4\. Di bagian bawah, atur **Bind Flow** ke `default-authentication-flow` dan **Base DN** ke Base DN Anda, misalnya `dc=example,dc=com`:

    <Frame caption="Authentik: bind flow dan Base DN provider LDAP">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-basedn.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=4ce418571d83294ee749d56b13c63d44" alt="" width="1120" height="810" data-path="images/on-premises/ldap-authentik-basedn.png" />
    </Frame>

    5\. Klik **Next** hingga halaman terakhir dan kirimkan aplikasi.
  </Step>

  <Step title="Izinkan akun bind mencari di direktori">
    Tanpa izin ini, akun bind hanya dapat melihat dirinya sendiri, pencarian tidak menemukan pengguna apa pun, dan setiap login LDAP gagal.

    Buka provider, masuk ke **Permissions**, lalu klik **Assign Role Object Permission**. Pada **Role**, ketik nomor dari langkah 1 dan pilih `ak-managed-role--user-<number>`, lalu aktifkan **Search full LDAP directory**:

    <Frame caption="Authentik: memberikan izin pencarian kepada akun bind (instans uji)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-assign.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=5af53c691ae845adcb4ede42c24fb600" alt="" width="1120" height="529" data-path="images/on-premises/ldap-authentik-assign.png" />
    </Frame>

    Role tersebut kemudian menampilkan tanda centang di bawah **Search full LDAP directory**:

    <Frame caption="Authentik: izin pada provider LDAP (instans uji)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-permissions.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=24ae7f0dfb6d19e1b3d6584d6ccf0f0b" alt="" width="990" height="488" data-path="images/on-premises/ldap-authentik-permissions.png" />
    </Frame>
  </Step>

  <Step title="Jalankan outpost LDAP">
    Authentik melayani LDAP melalui outpost, yaitu kontainer terpisah. Buka **Applications > Outposts**, buat outpost bertipe **LDAP** dengan provider Anda, lalu deploy sesuai petunjuk Authentik. Outpost mendengarkan di port 389 pada host tempat ia berjalan. Saat sudah terhubung, outpost menampilkan tanda centang hijau:

    <Frame caption="Authentik: outpost LDAP yang sedang berjalan (instans uji)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-outposts.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=cd8af2f7df7b2df24d2369416509faef" alt="" width="990" height="468" data-path="images/on-premises/ldap-authentik-outposts.png" />
    </Frame>

    ```dotenv theme={null}
    OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
    ```
  </Step>

  <Step title="Isi DN">
    Halaman provider menampilkan Base DN dan sebuah contoh di bawah **How to connect**:

    <Frame caption="Authentik: ikhtisar provider LDAP (instans uji)">
      <img src="https://mintcdn.com/ayakaleaf-pro/TjqwH4XzxYAkHStq/images/on-premises/ldap-authentik-provider.png?fit=max&auto=format&n=TjqwH4XzxYAkHStq&q=85&s=9aa4b747f4c0f51533454a97d835c18c" alt="" width="990" height="773" data-path="images/on-premises/ldap-authentik-provider.png" />
    </Frame>

    Jangan menyalin nilai contoh apa adanya:

    * **Bind DN** menampilkan akun yang sedang Anda gunakan untuk login. Gunakan akun bind dari langkah 1 sebagai gantinya: `cn=ldapservice,ou=users,<Base DN>`.
    * **Search base** menampilkan Base DN. Gunakan `ou=users,<Base DN>`.

    ```dotenv theme={null}
    OVERLEAF_LDAP_BIND_DN=cn=ldapservice,ou=users,dc=example,dc=com
    OVERLEAF_LDAP_BIND_CREDENTIALS=<password of ldapservice>
    OVERLEAF_LDAP_SEARCH_BASE=ou=users,dc=example,dc=com
    OVERLEAF_LDAP_SEARCH_FILTER=(cn={{username}})
    ```

    <Warning>
      Authentik menyimpan grup dengan nama setiap pengguna di bawah `ou=virtual-groups`. Mencari `(cn=alice)` di seluruh Base DN akan menemukan `cn=alice,ou=users,…` sekaligus `cn=alice,ou=virtual-groups,…`, dan Overleaf menolak login yang cocok dengan lebih dari satu entri. Tetap gunakan search base `ou=users,<Base DN>`.
    </Warning>
  </Step>

  <Step title="Periksa pencarian">
    Sebelum menjalankan Overleaf, jalankan pencarian yang akan dilakukannya. Hasilnya harus menampilkan tepat satu `dn:`:

    ```shell theme={null}
    ldapsearch -x -H ldap://ldap.example.com:389 \
      -D cn=ldapservice,ou=users,dc=example,dc=com -w '<password of ldapservice>' \
      -b ou=users,dc=example,dc=com '(cn=alice)' dn
    ```

    Jika tidak ada `dn:` sama sekali, biasanya izin dari langkah 3 belum diberikan.
  </Step>

  <Step title="Petakan admin (opsional)">
    Grup milik pengguna ada di `memberOf`, berupa DN di bawah `ou=groups`. Untuk menjadikan anggota grup Authentik `Admins` sebagai admin Overleaf:

    ```dotenv theme={null}
    OVERLEAF_LDAP_IS_ADMIN_ATT=memberOf
    OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=cn=Admins,ou=groups,dc=example,dc=com
    ```

    <Warning>
      Status admin diperbarui pada setiap login LDAP. Jika atribut atau nilainya salah, setiap admin yang login melalui LDAP akan kehilangan hak admin. Uji pemetaan ini terlebih dahulu dengan akun admin kedua.
    </Warning>
  </Step>
</Steps>

<Accordion title="variables.env yang telah diuji untuk goauthentik">
  ```dotenv title="variables.env" wrap theme={null}
  EXTERNAL_AUTH=ldap
  OVERLEAF_LDAP_IDENTITY_SERVICE_NAME=Log in with Authentik
  OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
  OVERLEAF_LDAP_BIND_DN=cn=ldapservice,ou=users,dc=example,dc=com
  OVERLEAF_LDAP_BIND_CREDENTIALS=<password of ldapservice>
  OVERLEAF_LDAP_SEARCH_BASE=ou=users,dc=example,dc=com
  OVERLEAF_LDAP_SEARCH_FILTER=(cn={{username}})
  OVERLEAF_LDAP_EMAIL_ATT=mail
  OVERLEAF_LDAP_NAME_ATT=name
  OVERLEAF_LDAP_IS_ADMIN_ATT=memberOf
  OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=cn=Admins,ou=groups,dc=example,dc=com
  OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN=true
  ```
</Accordion>


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