# Verifikasi login Fikri + debug jika di browser masih gagal

Dokumen ini untuk **tim FE / QA** (bisa diteruskan utuh). Di server staging/produksi yang sama dengan repo ini, login akun seed sudah **diverifikasi lewat curl**; jika di **browser** masih gagal, penyebabnya hampir selalu **lingkungan browser / deploy / jaringan**, bukan password seed yang salah.

---

## 0. Perbaikan kode FE (bukan dokumen saja) — cookie sebelum navigasi

Gejala: API `POST …/workpulse-api/…/login` **200** + `ok: true`, tetapi user tetap di halaman login atau terlempar balik. Penyebab: **`useCookie` di Nuxt menulis `document.cookie` lewat `watch` (bisa tertunda)**. `navigateTo("/")` memicu fetch ke Nitro **sebelum** cookie `workpulse-auth` ada di header → middleware `server/middleware/00-workpulse-auth-redirect.ts` membalas **302 ke `/login`**.

**Perbaikan:** `composables/useAuth.ts` memanggil penulisan **`document.cookie` sinkron** saat `setAuth()` di klien (selaras Path / Max-Age / SameSite / Secure dengan opsi cookie). Setelah deploy ini, alur login + redirect harus konsisten.

---

## 1. Akun uji (dari migrasi BE)

| Field | Nilai |
|--------|--------|
| Email | `fikri@softcomp.io` |
| Password | `Bestari24!` |
| Role (di DB) | `superadmin` |

---

## 2. Hasil tes di server (sudah dijalankan)

Perintah berikut mengembalikan **HTTP 200**, body JSON `ok: true`, berisi `accessToken`, `refreshToken`, dan `user` (termasuk `role`).

**Langsung ke Gin (port 3040):**

```bash
curl -sS -m 15 -w "\nHTTP:%{http_code}\n" \
  -X POST http://127.0.0.1:3040/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"fikri@softcomp.io","password":"Bestari24!"}'
```

**Lewat Nitro same-origin proxy (port 3020):**

```bash
curl -sS -m 15 -w "\nHTTP:%{http_code}\n" \
  -X POST http://127.0.0.1:3020/workpulse-api/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"fikri@softcomp.io","password":"Bestari24!"}'
```

**Kesimpulan:** stack **BE + DB + proxy `WORKPULSE_INTERNAL_API_ORIGIN` → Gin** untuk path login **hidup**. Jika web user tidak bisa login, fokus ke: **URL yang dibuka user**, **build/deploy FE**, **Network tab**, atau **password manager / autofill**.

---

## 3. Checklist di browser (wajib untuk user yang “tidak bisa login”)

1. **URL**  
   Buka **`https://work.rycroftapparel.com/login`** (HTTPS). Hindari `http://` untuk produksi: cookie flag `Secure` + redirect 301 pada POST bisa membuat body hilang (lihat checklist Apache / plugin HTTPS).

2. **Network → request login**  
   - Harus ada **`POST …/workpulse-api/api/v1/auth/login`** (same-origin), **bukan** memanggil `localhost:8000` atau host lain.  
   - Status **200** + body `ok: true` = API sukses; jika tidak redirect ke dashboard, periksa middleware / cookie `workpulse-auth` (langkah 4) dan **bagian §0** (cookie tertunda vs navigasi).  
   - **401** + `invalid_credentials` = email/password salah atau typo (periksa `!` di akhir password).  
   - **504** / pending lama = BE/DB/proksi (lihat `docs/BE_OPS_LOGIN_API_HANG.md`).  
   - **CORS error** di konsol saat POST ke domain lain = `NUXT_PUBLIC_WORKPULSE_API_BASE` mengarah ke API lintas origin tanpa CORS; untuk alur normal pakai **`/workpulse-api`** (default `ecosystem.config.cjs`).

3. **Application → Cookies**  
   Setelah login sukses, cookie **`workpulse-auth`** harus bernilai **`1`** (path `/`).  
   `composables/useAuth.ts` memakai `Secure` hanya jika **`https:`** di klien atau header **`X-Forwarded-Proto: https`** di sisi server — selaras dengan Apache SSL.

4. **Password manager**  
   Pastikan field benar-benar berisi `Bestari24!` (huruf B besar, angka 24, tanda seru). Coba isi manual atau incognito untuk menyingkirkan autofill salah.  
   **Catatan FE:** autofill kadang mengisi tampilan kotak tanpa memperbarui `v-model` Vue — `pages/login.vue` menyinkronkan nilai dari DOM sebelum submit; jika masih kosong, ketuk sekali di kotak password lalu Sign In lagi.

---

## 4. Deploy FE yang konsisten dengan tes curl

Setelah pull kode:

```bash
cd /var/www/html/wp-system/FE
npm run build
pm2 delete workpulse-fe && pm2 start ecosystem.config.cjs && pm2 save
```

Pastikan **`ecosystem.config.cjs`** memuat setidaknya:

- `NUXT_PUBLIC_WORKPULSE_API_BASE: "/workpulse-api"`
- `WORKPULSE_INTERNAL_API_ORIGIN: "http://127.0.0.1:3040"` (atau origin internal yang benar jika API tidak di 3040)

Tanpa build ulang, perubahan env public Nuxt bisa tidak terbawa ke klien.

---

## 5. Kode FE terkini (ringkas)

- `pages/login.vue`: `definePageMeta({ layout: "guest", ssr: false })` + form `@submit.prevent` — mengurangi hydration mismatch dan Enter/submit.  
- `composables/useAuth.ts`: `loginWithPassword` → `$fetch.raw` ke `{base}/api/v1/auth/login`, timeout klien ~22s, penanganan `error.code === "timeout"` dan **504**; **`setAuth` menulis cookie ke `document` secara sinkron** (§0).  
- `utils/workpulse-api-base.ts`: di hostname produksi, base `localhost` dinormalisasi ke **`/workpulse-api`**.  
- `server/routes/workpulse-api/[...path].ts`: proxy ke `workpulseInternalApiOrigin`.

---

## 6. Referensi silang

| Topik | Dokumen |
|--------|---------|
| Checklist produksi login | `docs/BE_LOGIN_PROD_CHECKLIST.md` |
| Proxy & ops | `docs/BE_OPS_LOGIN_DAN_PROXY.md` |
| Hang / timeout | `docs/BE_OPS_LOGIN_API_HANG.md` |

---

*Jika setelah langkah 3–4 masih gagal, lampirkan screenshot Network (URL penuh request, status, response body) tanpa menyertakan token lengkap di chat publik.*

### Tes login (server)

| Tes | Hasil |
|-----|--------|
| `POST http://127.0.0.1:3040/api/v1/auth/login` dengan `fikri@softcomp.io` + `Bestari24!` | 200, `ok: true`, token + `user.role`: superadmin |
| `POST http://127.0.0.1:3020/workpulse-api/api/v1/auth/login` (sama body) | 200, `ok: true` |

Jadi email/password seed benar dan BE + proxy Nitro di mesin ini berjalan. Kalau di web Anda masih gagal setelah deploy **build terbaru**, itu biasanya URL (http vs https), autofill, atau Network di browser — gunakan checklist di atas.

**Path file ini:** `/var/www/html/wp-system/FE/docs/FE_LOGIN_VERIFIKASI_FIKRI_DAN_DEBUG.md`
