# Launch SDK 帳號退出重試修復

日期：2026-10-24。已修復 AUTH-07，并同步 Go、JavaScript、Python、C#、Java、Ruby、Rust、C、C++ 的帳號生命周期入口。**未部署、未發布 SDK、未提交或推送 Git。** 本任務沒有修改 Launch 或 Licentivo 服務端業務代碼。

## 行為

顯式退出先將安全存儲中的帳號記錄標記為“僅待撤銷”，再調用官方 SDK 退出并向 Launch 提交帳號會話撤銷。無論網路或取消狀態如何，本地運行時都會停止，不允許繼續執行受保護功能。

Launch 未確認撤銷時，SDK 保留待辦及重試所需的原帳號憑據，不再把它當作已登錄帳號。再次 `Logout`、`Login` 或 `Restore` 會恢復撤銷請求；`Restore` 不會拿待辦請求身份或啟動授權運行時。收到成功響應，或收到表明原會話已不能認證的 HTTP 401 后，才刪除帳號待辦。因此響應丟失也能恢復，不會出現“第二次退出返回成功，但從未補交撤銷”的情況。

正常已登錄記錄仍兼容 v2。待撤銷記錄使用私有 v3 格式；Java、Rust 還移除了正常登錄所需的憑據字段形狀，避免舊版 SDK 將待辦誤當成正常登錄。待辦不保存短期身份斷言、許可證密鑰或簽名許可。

帳號待辦使用原來配置的安全 `Store`。**跨進程恢復需要持久化安全存儲**，例如 Windows DPAPI 或 SDK 支持的加密存儲；預設 `MemoryStore` 只在本進程保留資料。重試由后續登錄、恢復或退出操作觸發，沒有新增獨立后臺任務。存儲或撤銷未完成會返回錯誤或待完成結果，不提示成功。

Licentivo SDK 的設備退出票據和 `.logout.json` 仍由它管理，Launch 不刪除其快取目錄，不判斷設備、功能或離線權限。同步更新了原生示例和各語言 SDK 文件。

## 驗證

| 范圍 | 結果 |
| --- | --- |
| Launch Go 源碼包 | 185 條測試通過記錄，含子用例；無失敗；`go vet` 通過 |
| 真實 Launch HTTP 與 MySQL | 退出請求中斷后，安全待辦保留；重建 SDK 后無法恢復登錄；網路恢復后補交撤銷，舊 token 的認證和身份接口均返回拒絕 |
| JavaScript | 10 項通過，含退出失敗、重建恢復、401 確認 |
| Python | 8 項通過，含退出后本地帳號清理、重建恢復和 Windows DPAPI |
| C# | 生命周期、待辦恢復、SDK 退出日志保留及 DPAPI 檢查通過 |
| Java | 7 組生命周期與安全測試通過，含離線退出重試 |
| Ruby | 帳號生命周期、待辦恢復和加密存儲回歸通過 |
| Rust | 全部本地測試通過，含待辦重建恢復和實際 SDK 運行 |
| C / C++ | 實際簽名 SDK、斷網重建恢復、401 確認、DPAPI 和 C++ 運行入口通過 |
| Licentivo 當前授權修復 | 45 條測試通過記錄，無失敗、無跳過；包含策略漂移下負向通知、低配設備協調、人工設備上限及現有授權回歸 |
| 嵌入的官方 SDK | 清單中 115 個文件哈希全部匹配，未修改其授權或加密實現 |

Launch 源碼回歸中，`TestMySQLBaseline`、`TestProductUploadRoundTrip`、`TestInitialAdministratorMustChangePasswordBeforeAdministration`、`TestNewPaymentProvidersAndRegistrationWithoutMail` 四項依賴其他專用庫的測試跳過，未計作通過；本次 SDK、帳號 HTTP、購買同步和映射流程使用獨立測試庫完成驗證。

## 兩端聯調

使用本機獨立 MySQL 8.0.32、當前 Launch、Licentivo 服務及其工作進程、實際 Go Launch SDK 與官方授權運行時、DPAPI 帳號存儲，完成 **15 個業務階段**。

新增兩種退出故障驗證：

1. **請求未送達 Launch**：帳號退出接口暫時返回 503。SDK 停止本地功能，真實 Licentivo 設備綁定釋放，帳號撤銷待辦保留。重建 SDK 后仍只重試退出；恢復連接后，原 Launch 會話被撤銷，Licentivo 確認收到對應會話通知。
2. **服務端已撤銷，但回包丟失**：Launch 已處理退出，測試代理將響應替換為 503。待辦跨 SDK 重建保留；恢復連接后，通過 HTTP 401 確認原會話失效并刪除待辦。過程中沒有恢復登錄或重新激活設備。

其余階段覆蓋實際購買同步與簽名功能運行、普通關閉恢復、正常退出、遠程解綁及舊代次、續費退款、帳號撤銷與重新登錄、全額退款拒絕運行、退款恢復、拒付和大文件翻譯回歸。Licentivo 三項更新由其負責方提供，本任務只構建和驗證。

支付渠道和 DeepL 使用隔離模擬服務，沒有真實扣款、退款或付費翻譯。真實聯合服務驗證使用 Go；其他語言完成本地 SDK 回歸，不聲稱九種語言分別完成了一套真實服務部署驗收。

本輪未訪問 `192.168.2.177`。MySQL 與 Licentivo 臨時進程均已停止，原有服務及測試證據保留。原始材料在 `.local/logout-retry-fix-20261024/`，摘要與源碼哈希見 [驗證證據](https://github.com/spf86/licentivo-launch/blob/main/docs/logout-retry-fix-evidence-2026-10-24.json)。
