refactor(pl24): oturum modeli — tek login, çerez tabanlı authorize yenileme #261

Merged
root merged 1 commits from dev into main 2026-09-17 13:01:28 +03:00
Owner

Faz 1 / adım 1: PL24 oturum modeli. Analiz /home/s/ss/plv2.md §4.1 (bulgular auth-02/03/05/06/09/11/15, p4legacy-07, consumers-04).

Sorun

PL24'ün base JWT'si 600 saniye yaşıyor ve kod bunu oturum sayıyordu: isTokenValidlogin(squeezeOut:true). Talep varsa her ~9 dakikada bir yeniden login (günde ~144/hesap). PL24 hesap başına tek oturum verdiği için bu hem kendi oturumumuzu sürekli düşürüyor hem de iki hesap banından (tr 2026-07-24, de 2026-09-04) önceki otomasyon imzasını oluşturuyordu. Canlı kanıt: her boot'ta prewarm iki paralel login atıyor ve biri HTTP 500 alıyordu (logins 1/2).

Portalın kendisi bir kez login olup PL24TOKEN çerezini saklıyor, sonra yalnız authorize'ı yeniliyor. Artık biz de öyle yapıyoruz.

Değişiklik

  • Oturum = PL24TOKEN çerezi (süresiz). ensureSession() sahibi; Redis'te pl24:auth:session:<hesap> ile 24 saat paylaşılır, api ve worker aynı oturumu devralır. Süre kontrolü yok — oturum yalnız sunucu reddedince düşer.
  • Servis token'ı authorize ile mint edilir ve yalnız Cookie: PL24TOKEN ile istenir (Bearer gerekmiyor, canlı doğrulandı).
  • session_status:"gone" ve authorize 401/403 artık okunuyor → oturum düşürülür, tek sefer yeniden login + retry.
  • Single-flight: süreç içi promise + Redis kilidi; kilidi alamayan paylaşılan oturumu bekler.
  • Login sözleşmesi: portal ucu /auth/ext/api/1.1/login, RFC7807 problem gövdesi tiplendi. Önce squeezeOut:false, yalnız session-limit'te squeezeOut:true. PL24_LOGIN_API=legacy eski uca döner (geri çekilme bayrağı).
  • Hata sınıflandırma: account-not-active / user-not-active / authentication / 2FA → ilk hatada 6 saat devre kesici (ölü hesap prod'da 5 dakikada bir, 376 ardışık 401 denenmişti). Ağ/timeout → 5 dakika. Ayrıca saatlik login tavanı (6).
  • P4 (.action) sayfalarında authorize kaldırıldı — yalnız çerez gönderiliyor. Ford/PSA'daki 18 ısıtma authorize çağrısı ensureSession'a indirildi; demo-sayfa/401 çaresi artık oturum yenileme.
  • Gerçek Chrome User-Agent; authorize'a pl24-wmidata (portal WMI decode hazırlığı); ölü kod silindi (base-JWT yolu, hasService, getAvailableServices, AUTH_TOKEN_TTL).

Doğrulama

  • Birim: pl24-auth.service.spec.ts yeniden yazıldı — 19 test (tek login, single-flight, Redis devralma, cookie-only authorize, gone/401 yeniden login, 412/400 squeezeOut, P4 cookie-only header, kalıcı hata kesicisi, saatlik tavan). Tüm PL24 + tüketici paketleri 188 test geçti; tsc ve biome temiz.
  • Dev: commit e50a907 deploy edildi (2489), temiz boot, PL24 dev'de kapalı olduğu için ağa çıkmadı.
  • Canlı sözleşme testi (prod oturumu bozulmadan): squeezeOut:false ile login denemesi → HTTP 400 application/problem+json, type: urn:login:session-limit-exceeded, Set-Cookie YOK (oturum düşmedi). Kod hem 400 hem 412'yi bu tip için işliyor.

Risk / geri alma

Dev'de canlı PL24 doğrulaması bilinçli yapılmadı: dev login atarsa prod oturumunu düşürür. Prod'da merge sonrası ilk boot gerçek doğrulama olacak; beklenen log PL24 login (de) successful — session established ve ardından Authorizing service ... for account de. Sorun çıkarsa PL24_LOGIN_API=legacy eski login ucuna döner; tam geri alma git revert + redeploy.

Beklenen etki: günlük login sayısı ~144'ten 0-1'e, P4 sayfa başına authorize isteği sıfıra iner.

🤖 Generated with Claude Code

Faz 1 / adım 1: PL24 oturum modeli. Analiz `/home/s/ss/plv2.md` §4.1 (bulgular auth-02/03/05/06/09/11/15, p4legacy-07, consumers-04). ## Sorun PL24'ün base JWT'si **600 saniye** yaşıyor ve kod bunu oturum sayıyordu: `isTokenValid` → `login(squeezeOut:true)`. Talep varsa **her ~9 dakikada bir yeniden login** (günde ~144/hesap). PL24 hesap başına tek oturum verdiği için bu hem kendi oturumumuzu sürekli düşürüyor hem de iki hesap banından (tr 2026-07-24, de 2026-09-04) önceki otomasyon imzasını oluşturuyordu. Canlı kanıt: her boot'ta prewarm iki paralel login atıyor ve biri `HTTP 500` alıyordu (`logins 1/2`). Portalın kendisi bir kez login olup `PL24TOKEN` çerezini saklıyor, sonra yalnız `authorize`'ı yeniliyor. Artık biz de öyle yapıyoruz. ## Değişiklik - **Oturum = PL24TOKEN çerezi** (süresiz). `ensureSession()` sahibi; Redis'te `pl24:auth:session:<hesap>` ile 24 saat paylaşılır, api ve worker aynı oturumu devralır. Süre kontrolü yok — oturum yalnız sunucu reddedince düşer. - **Servis token'ı** authorize ile mint edilir ve **yalnız `Cookie: PL24TOKEN`** ile istenir (Bearer gerekmiyor, canlı doğrulandı). - `session_status:"gone"` ve authorize 401/403 artık okunuyor → oturum düşürülür, tek sefer yeniden login + retry. - **Single-flight**: süreç içi promise + Redis kilidi; kilidi alamayan paylaşılan oturumu bekler. - **Login sözleşmesi**: portal ucu `/auth/ext/api/1.1/login`, RFC7807 problem gövdesi tiplendi. Önce `squeezeOut:false`, yalnız session-limit'te `squeezeOut:true`. `PL24_LOGIN_API=legacy` eski uca döner (geri çekilme bayrağı). - **Hata sınıflandırma**: account-not-active / user-not-active / authentication / 2FA → ilk hatada **6 saat** devre kesici (ölü hesap prod'da 5 dakikada bir, 376 ardışık 401 denenmişti). Ağ/timeout → 5 dakika. Ayrıca saatlik login tavanı (6). - **P4 (.action) sayfalarında authorize kaldırıldı** — yalnız çerez gönderiliyor. Ford/PSA'daki 18 ısıtma authorize çağrısı `ensureSession`'a indirildi; demo-sayfa/401 çaresi artık oturum yenileme. - Gerçek Chrome User-Agent; authorize'a `pl24-wmidata` (portal WMI decode hazırlığı); ölü kod silindi (base-JWT yolu, hasService, getAvailableServices, AUTH_TOKEN_TTL). ## Doğrulama - **Birim**: `pl24-auth.service.spec.ts` yeniden yazıldı — 19 test (tek login, single-flight, Redis devralma, cookie-only authorize, gone/401 yeniden login, 412/400 squeezeOut, P4 cookie-only header, kalıcı hata kesicisi, saatlik tavan). Tüm PL24 + tüketici paketleri **188 test geçti**; `tsc` ve `biome` temiz. - **Dev**: commit `e50a907` deploy edildi (2489), temiz boot, PL24 dev'de kapalı olduğu için ağa çıkmadı. - **Canlı sözleşme testi (prod oturumu bozulmadan)**: `squeezeOut:false` ile login denemesi → `HTTP 400 application/problem+json`, `type: urn:login:session-limit-exceeded`, `Set-Cookie` YOK (oturum düşmedi). Kod hem 400 hem 412'yi bu tip için işliyor. ## Risk / geri alma Dev'de canlı PL24 doğrulaması bilinçli yapılmadı: dev login atarsa prod oturumunu düşürür. Prod'da merge sonrası ilk boot gerçek doğrulama olacak; beklenen log `PL24 login (de) successful — session established` ve ardından `Authorizing service ... for account de`. Sorun çıkarsa `PL24_LOGIN_API=legacy` eski login ucuna döner; tam geri alma `git revert` + redeploy. **Beklenen etki:** günlük login sayısı ~144'ten 0-1'e, P4 sayfa başına authorize isteği sıfıra iner. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
root added 1 commit 2026-09-17 01:06:33 +03:00
refactor(pl24): oturum modeli — tek login, çerez tabanlı authorize yenileme
Some checks are pending
QA Gate (P0/P1) / Test affected app (pull_request) Waiting to run
e50a907931
Faz 1 / adım 1 (analiz: /home/s/ss/plv2.md §4.1, bulgular auth-02/03/05/06/09/11/15,
p4legacy-07, consumers-04).

SORUN: PL24'ün base JWT'si 600 saniye yaşıyor ve kod bunu "oturum" sayıyordu
(isTokenValid → login). Talep varsa her ~9 dakikada bir squeezeOut:true ile
YENİDEN LOGIN atılıyordu (günde ~144 login/hesap). PL24 hesap başına tek oturum
veriyor; bu desen hem kendi oturumumuzu sürekli düşürüyor hem de iki hesap
banından önceki otomasyon imzasını oluşturuyordu. Portalın kendisi bir kez login
olup PL24TOKEN çerezini saklıyor ve yalnız authorize'ı yeniliyor.

DEĞİŞİKLİK:
- Oturum = PL24TOKEN çerezi (süresiz). `ensureSession()` sahibi; bellekte tutulur,
  Redis'te `pl24:auth:session:<hesap>` ile 24 saat paylaşılır (api/worker aynı
  oturumu devralır). Süre kontrolü YOK — oturum yalnız sunucu reddederse düşer.
- Servis token'ı = authorize ile mint edilen 600 s'lik JWT; yalnız `Cookie:
  PL24TOKEN` ile istenir (Bearer gerekmiyor — canlı doğrulandı).
- `session_status:"gone"` ve authorize 401/403 artık okunuyor: oturum düşürülür,
  tek sefer yeniden login + retry.
- Single-flight: süreç içi in-flight promise + Redis kilidi
  (`pl24:auth:login-lock:<hesap>`), kilidi alamayan paylaşılan oturumu bekler.
  Eski prewarm iki paralel login atıyordu ve biri her boot'ta HTTP 500 alıyordu.
- Login sözleşmesi: portal ucu `/auth/ext/api/1.1/login`
  ({account,user,password,squeezeOut} → {loginStatus,sessionToken} + Set-Cookie);
  RFC7807 problem gövdesi tiplendi. Önce squeezeOut:false denenir, yalnız
  "session-limit-exceeded"/USER_ALREADY_LOGGED_IN'de squeezeOut:true ile tekrar.
  `PL24_LOGIN_API=legacy` eski uca döner (bir sürüm geri çekilme bayrağı).
- Hata sınıflandırma: account-not-active / user-not-active / authentication /
  2FA-required → ilk hatada 6 saatlik devre kesici (eskiden ölü hesap 5 dakikada
  bir sonsuza dek deneniyordu: prod'da 376 ardışık 401). Ağ/timeout → 5 dakika.
- Saatlik login tavanı (hesap başına 6) — sağlıklı günde 0-1 login beklenir.
- P4 (.action) sayfaları için authorize kaldırıldı: yalnız çerez gönderiliyor
  (canlı doğrulandı). Ford/PSA'daki 18 "ısıtma" authorize çağrısı ensureSession'a
  indirildi; demo-sayfa/401 çaresi artık servis token temizleme değil oturum
  yenileme.
- Gerçek Chrome User-Agent sabiti (eski değer hiçbir tarayıcıda yok).
- authorize'a `pl24-wmidata` eklendi (portal WMI decode'u için ön hazırlık).
- Ölü kod silindi: getAccessToken*/getSessionCookie* base-JWT yolu, hasService,
  getAvailableServices, AUTH_TOKEN_TTL.

Test: pl24-auth.service.spec.ts yeniden yazıldı (19 test: tek login, single-flight,
Redis devralma, cookie-only authorize, gone/401 yeniden login, 412 squeezeOut,
P4 cookie-only header, kalıcı hata kesicisi, saatlik tavan). Tüm PL24 + tüketici
paketleri: 188 test geçti. tsc + biome temiz.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
root merged commit 62ad9ac318 into main 2026-09-17 13:01:28 +03:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: root/sase.tr#261