# 本機 OpenLDAP（k6 / dev）

與 `make k6-up` 或 `make ldap-up` 一併啟動的測試用 LDAP 目錄。ZITADEL 透過 **LDAP IdP** 連到這台伺服器；Gateway 仍只走 OIDC（`provider=ldap` + `LdapIdPID`）。

Compose 定義在 [docker-compose.yml](docker-compose.yml)，由主 [deploy/docker-compose.yml](../docker-compose.yml) `include` 進來。

## 啟動

```bash
# 方式 A：只起 LDAP（已有 ZITADEL 或其他服務時）
make ldap-up
make ldap-wait

# 方式 B：k6 全棧（含 Postgres + ZITADEL + OpenLDAP）
make k6-up
make k6-wait          # 自動：LDAP seed + ZITADEL LDAP IdP + OIDC App → k6.env

# 一鍵（含 Gateway 背景）
make dev-up

make ldap-test  # 確認 alice / bob 可查
```

`make k6-wait` 會執行 `ldap-seed`，並跑 [`deploy/zitadel/bootstrap_dev.py`](../zitadel/bootstrap_dev.py) 自動建立 ZITADEL **LDAP IdP** 與 **OIDC Web App**，把 `ZITADEL_LDAP_IDP_ID` / `ZITADEL_OAUTH_CLIENT_*` 寫入 `deploy/zitadel/machinekey/k6.env`。**不必再手動開 Console。**

## 連線資訊

| 項目 | 值 |
|------|-----|
| 主機（本機） | `localhost:389` |
| 主機（ZITADEL 容器內） | `openldap:389` |
| Base DN | `dc=gateway,dc=local` |
| Bind DN | `cn=admin,dc=gateway,dc=local` |
| Bind 密碼 | `admin` |
| Users OU | `ou=people,dc=gateway,dc=local` |

## 測試帳號

| uid | 密碼 | Email |
|-----|------|-------|
| `alice` | `Password1!` | alice@gateway.local |
| `bob` | `Password1!` | bob@gateway.local |

登入 ZITADEL LDAP IdP 時，使用者名稱通常填 **uid**（例如 `alice`），不是 email。

## 在 ZITADEL Console 建立 LDAP IdP

1. 開啟 http://localhost:8080/ui/console（admin：`zitadel-admin@zitadel.localhost` / `Password1!`）
2. **Settings → Identity Providers → New → LDAP**（Generic LDAP）
3. 建議欄位（名稱可自訂）：

| 欄位 | 建議值 |
|------|--------|
| Servers | `ldap://openldap:389` |
| StartTLS | 關閉 |
| Bind DN / Username | `cn=admin,dc=gateway,dc=local` |
| Bind password | `admin` |
| User base DN | `ou=people,dc=gateway,dc=local` |
| User object class | `inetOrgPerson` |
| User unique attribute | `uid` |
| User filters / Login filter | `uid` |
| Email attribute | `mail` |
| Display name attribute | `cn` |
| Username attribute | `uid` |

4. 儲存後複製 **IdP ID**，寫入 Gateway：

```yaml
# etc/gateway.k6.yaml 或 gateway.dev.yaml
Zitadel:
  OAuthClientID: "<你的 OIDC app client id>"
  OAuthClientSecret: "<secret>"
  LdapIdPID: "<zitadel-ldap-idp-id>"
```

5. 重啟 Gateway，前端登入頁點 **使用 LDAP 登入**，以 `alice` / `Password1!` 測試。

## 本機 ldapsearch（選用）

```bash
make ldap-test

# 或手動（需本機 openldap 客戶端：brew install openldap）
ldapsearch -x -H ldap://localhost:389 \
  -D "cn=admin,dc=gateway,dc=local" -w admin \
  -b "ou=people,dc=gateway,dc=local" "(uid=alice)" mail cn
```

## 重設資料

```bash
make k6-down   # 會刪除 openldap volume，下次 k6-up 會重新 bootstrap LDIF
```

## 注意

- 僅供本機開發；`admin` / `Password1!` 不可上線。
- 若改過 LDIF，可 `make ldap-seed` 重灌（已存在的 entry 會略過）；要完全重建請 `make k6-down` 後再 `make k6-up`。
