> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/on-premises/id/konfigurasi/overleaf-toolkit/authentication/ldap-authentication.md).

# Autentikasi LDAP

Fitur ini dikembangkan oleh [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). Di sini kami menawarkan beberapa dokumen untuk konfigurasi Anda.

{% hint style="warning" %}
Overleaf menggunakan **passport-ldapauth** pustaka, yang relatif sudah usang, kompatibilitas LDAP tidak dapat dijamin sepenuhnya. Dengan penyedia identitas LDAP tertentu (misalnya, <https://goauthentik.io/>), kegagalan login dapat terjadi. Karena itu, jika memungkinkan, disarankan untuk menggunakan metode OAuth/SAML sebelumnya.
{% endhint %}

### 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 terhadap server LDAP yang dikonfigurasi, misalnya `ldap://ldap:10389`.

<figure><img src="/files/25bb8975cf53d54e8affad3dceb5f57c61668f9a" alt=""><figcaption><p>Contoh Server Pro untuk LDAP</p></figcaption></figure>

### Konfigurasi

Secara internal, Overleaf LDAP menggunakan [passport-ldapauth](https://github.com/vesse/passport-ldapauth) pustaka. Sebagian besar opsi konfigurasi ini diteruskan ke `server` objek config yang digunakan untuk mengonfigurasi `passport-ldapauth`. Jika Anda mengalami masalah saat mengonfigurasi LDAP, ada baiknya membaca README untuk `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 adalah sebuah daftar. Jika daftar tersebut mencakup `ldap` maka autentikasi LDAP akan diaktifkan.

Contohnya: `EXTERNAL_AUTH=ldap saml`

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

Saat menggunakan metode autentikasi LDAP, pengguna memasukkan sebuah `nama pengguna` dan `kata sandi` di formulir login, akan dicoba:

1. Pengguna LDAP dicari di direktori LDAP menggunakan filter yang ditentukan oleh `OVERLEAF_LDAP_SEARCH_FILTER` dan diautentikasi.
2. Jika autentikasi berhasil, basis data pengguna Overleaf diperiksa untuk mencari pengguna dengan alamat email utama yang cocok dengan alamat email pengguna LDAP yang diautentikasi:
   * Jika pengguna yang cocok ditemukan, `hashedPassword` bidang untuk pengguna ini dihapus (jika ada). Ini memastikan bahwa pengguna tersebut hanya dapat masuk melalui autentikasi LDAP di masa mendatang.
   * Jika tidak ditemukan pengguna yang cocok, pengguna Overleaf baru dibuat menggunakan email, nama depan, dan nama belakang yang diambil dari server LDAP.

{% hint style="danger" %}
Untuk pengguna yang masuk melalui LDAP, kami tidak menyimpan (atau menghapus yang sudah ada) kata sandi hash di basis data mongo Overleaf.
{% endhint %}

#### Variabel Lingkungan

* `OVERLEAF_LDAP_URL` **(wajib)**
  * URL server LDAP.
    * Contoh: `ldaps://ldap.example.com:636` (LDAP melalui SSL)
    * Contoh: `ldap://ldap.example.com:389` (tanpa enkripsi atau STARTTLS, jika dikonfigurasi).
* `OVERLEAF_LDAP_IDENTITY_SERVICE_NAME`
  * Nama tampilan untuk layanan identitas LDAP, digunakan di halaman login.
  * Bawaan ke `Masuk dengan Penyedia LDAP`.
* `OVERLEAF_LDAP_EMAIL_ATT`
  * Atribut email yang dikembalikan oleh server LDAP, bawaan `mail`. Setiap pengguna LDAP harus memiliki setidaknya satu alamat email. Jika beberapa alamat disediakan, hanya yang 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 ditentukan, nama depan dan/atau nama belakang pengguna diekstrak dari variabel ini. Jika tidak, variabel ini tidak digunakan.
* `OVERLEAF_LDAP_PLACEHOLDER`
  * Placeholder untuk formulir login, bawaan ke `Nama pengguna`.
* `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
  * Jika disetel ke `true`, memperbarui pengguna LDAP `first_name` dan `last_name` bidang saat login, dan menonaktifkan formulir detail pengguna pada halaman `/user/settings` untuk pengguna LDAP. Jika tidak, detail hanya akan diambil pada login pertama.
* `OVERLEAF_LDAP_BIND_DN`
  * Nama terbedakan dari pengguna LDAP yang harus digunakan untuk koneksi LDAP (pengguna ini harus dapat mencari/mendaftar akun di server LDAP), misalnya, `cn=ldap_reader,dc=example,dc=com`. Jika tidak ditentukan, pengikatan anonim digunakan.
* `OVERLEAF_LDAP_BIND_CREDENTIALS`
  * Kata sandi untuk `OVERLEAF_LDAP_BIND_DN`.
* `OVERLEAF_LDAP_BIND_PROPERTY`
  * Properti pengguna yang akan dipakai untuk melakukan bind terhadap klien, bawaan ke `dn`.
* `OVERLEAF_LDAP_SEARCH_BASE` **(wajib)**
  * Base DN yang digunakan untuk mencari 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 diinterpolasikan ke pencarian LDAP.
    * Contoh: `(|(uid={{username}})(mail={{username}}))` (pengguna dapat masuk dengan email atau dengan nama login).
    * Contoh: `(sAMAccountName={{username}})` (Active Directory).
* `OVERLEAF_LDAP_SEARCH_SCOPE`
  * Ruang lingkup pencarian dapat berupa `base`, `satu tingkat`, atau `sub` (bawaan).
* `OVERLEAF_LDAP_SEARCH_ATTRIBUTES`
  * Array JSON atribut yang akan diambil dari server LDAP, misalnya, `["uid", "mail", "givenName", "sn"]`. Secara bawaan, semua atribut diambil.
* `OVERLEAF_LDAP_STARTTLS`
  * Jika `true`, LDAP melalui TLS digunakan.
* `OVERLEAF_LDAP_TLS_OPTS_CA_PATH`
  * Jalur ke berkas yang berisi sertifikat CA yang digunakan untuk memverifikasi sertifikat SSL/TLS server LDAP. Jika ada beberapa sertifikat, maka bisa berupa array JSON berisi jalur ke sertifikat-sertifikat tersebut. Berkas harus dapat diakses oleh kontainer 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 disediakan.
* `OVERLEAF_LDAP_CACHE`
  * Jika `true`, maka hingga 100 kredensial sekaligus akan di-cache selama 5 menit.
* `OVERLEAF_LDAP_TIMEOUT`
  * Berapa lama klien harus membiarkan operasi berjalan sebelum time out, ms (Bawaan: Infinity).
* `OVERLEAF_LDAP_CONNECT_TIMEOUT`
  * Berapa lama klien harus menunggu sebelum time out pada koneksi TCP, ms (Bawaan: bawaan OS).
* `OVERLEAF_LDAP_IS_ADMIN_ATT` dan `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`
  * Ketika kedua variabel lingkungan disetel, proses login 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` disetel ke `false`. Jika salah satu dari variabel ini tidak disetel, maka status admin hanya disetel ke `true` saat pembuatan pengguna admin di Launchpad.

Lima variabel berikut digunakan untuk mengonfigurasi bagaimana kontak pengguna diambil dari server LDAP.

* `OVERLEAF_LDAP_CONTACTS_FILTER`
  * Filter yang digunakan untuk mencari pengguna di server LDAP agar dimuat ke 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 ditentukan, tidak ada pengguna yang diambil dari server LDAP ke kontak.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_BASE`
  * Menentukan base DN dari mana pencarian kontak dimulai. Bawaan ke `OVERLEAF_LDAP_SEARCH_BASE`.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_SCOPE`
  * Ruang lingkup pencarian dapat berupa `base`, `satu tingkat`, atau `sub` (bawaan).
* `OVERLEAF_LDAP_CONTACTS_PROPERTY`
  * Menentukan properti dari objek pengguna yang akan menggantikan placeholder '{{userProperty}}' dalam `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 ditentukan, filter yang dihasilkan tidak akan cocok dengan apa pun. Nilai `*` dapat digunakan sebagai wildcard.

<details>

<summary><strong>Contoh</strong></summary>

```
OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE=1000
```

Contoh di atas menghasilkan pemuatan ke kontak pengguna LDAP saat ini semua pengguna LDAP yang memiliki UNIX yang sama `gid`. Pengguna non-LDAP akan memiliki semua pengguna LDAP dengan UNIX `gid=1000` di kontak mereka.

</details>

<details>

<summary><strong>Contoh berkas variables.env</strong></summary>

```
OVERLEAF_APP_NAME="Instans Overleaf Kami"

ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

# Mengaktifkan pembuatan thumbnail menggunakan ImageMagick
ENABLE_CONVERSIONS=true

# Menonaktifkan persyaratan konfirmasi email
EMAIL_CONFIRMATION_DISABLED=true

## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768

## Atur untuk TLS melalui nginx-proxy
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true

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

OVERLEAF_LEFT_FOOTER=[{"text": "Hubungi tim dukungan Anda", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"Halo, saya di sisi kanan", "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=Sistem ini dijalankan oleh departemen x

OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true

#################
## LDAP untuk 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='Nama pengguna atau alamat email'

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='*'
```

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/on-premises/id/konfigurasi/overleaf-toolkit/authentication/ldap-authentication.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
