# 通过 Launch 与 Licentivo 接入应用

本指南适用于 Licentivo 提供方。不使用 Licentivo、而对接商户自有授权系统时，应使用[自定义授权 API 与接入流程](/zh/launch-documents/external-licensing/)，为产品和环境选择 `custom_http`，并保留该系统的运行时 SDK。

这些尚未发布的本地改动使用账号身份交换。迁移及服务端会话撤销参见[职责与购买同步契约](/zh/launch-documents/account-purchase-boundary/)。本次改动没有发布或升级包版本号。

Launch 负责商户账号、订单、价格、续费和升级报价、退款及绝对购买日期。Licentivo 负责许可证、策略、设备额度、授权会话、签名许可和运行时决定。Launch 登录成功或购买同步成功，绝不表示可以执行受保护业务。

使用后台接入页取得直接连接调用和固定受信的产品公钥。九种语言包装层均包含官方 SDK。商户管理密钥和支付密钥留在服务端。公开产品设置不包含客户凭据、设备 ID、缓存路径或身份断言。

## 账号交换

```mermaid
sequenceDiagram
    participant App as Application
    participant Launch as Launch server
    participant SDK as Official Licentivo SDK
    participant Lic as Licentivo server
    App->>Launch: Account login
    Launch-->>App: Account session
    App->>Launch: POST /software/products/{id}/identity
    Launch-->>App: Short-lived signed identity assertion
    App->>SDK: In-memory identity + connection + environment
    SDK->>Lic: POST /launch/exchange
    Lic-->>SDK: Restricted device credential + signed permission + logout ticket
    App->>SDK: RunFeature around every protected action
```

包装层使用 `{"environment":"sandbox"}` 或 `live` 请求 `POST /api/v1/software/products/{id}/identity`。返回的身份断言最多存活 120 秒，绑定已注册签发者、受众、真实登录会话、产品、环境和购买引用。它不包含功能许可、设备额度或离线策略。

官方 SDK 在内存中接收以下值：

```json
{
  "product_id": "LICENTIVO_PRODUCT_UUID",
  "trusted_keys": {"SIGNING_KEY_ID": "PINNED_PUBLIC_KEY"},
  "launch_connection_id": "LICENTIVO_LAUNCH_CONNECTION_UUID",
  "environment": "sandbox",
  "identity_token": "SHORT_LIVED_ASSERTION_FROM_LAUNCH",
  "license_key": ""
}
```

不得将此运行时配置写入公开文件，或将身份断言持久化到账号记录。Launch v2 记住登录记录只保存账号会话和公开路由上下文。旧客户 `/credential` 接口返回 HTTP 410。

## 生命周期与存储

- `Login`：认证账号、申请新身份断言、启动官方 SDK。
- `Restore`：联网确认已记住的账号、申请新身份断言、启动官方 SDK。Launch 故障不决定离线许可。
- `RunFeature`：每次受保护执行都交给官方 SDK。被拒绝的回调绝不能执行。
- `Close` / `Dispose` / `Drop`：停止后台工作，保留明确记住的登录和节点绑定。
- `Logout`：调用官方 SDK 统一退出，再清除 Launch 账号记录并终止其账号会话。
- `ReleaseDevice`：明确退出的兼容别名。必须如实报告待完成的远端撤销。

只有官方 SDK 可删除其设备凭据和租约文件。绝不能删除缓存目录或 `.logout.json`；该日志保存网络请求失败后仍需使用的受限释放票据。再次初始化匹配缓存时，SDK 会恢复待处理票据。Launch 自有账号存储与 SDK 存储分别由各自管理。

需要离线启动的应用使用官方 SDK 文档规定的恢复流程。只有 SDK 验证签名许可、产品与环境上下文、到期、时钟行为和设备状态。Launch 包装层不从购买日期、本地订单或文件存在与否推断许可。

账号会话默认只保存在内存。持久账号存储必须加密并认证记录，使用操作系统凭据设施保护密钥。按商户、账号、产品和环境使用独立可写缓存。浏览器渲染进程只接收业务结果，不接收桌面账号令牌、身份断言或设备凭据。

## 购买与设备

Launch 根据已验证付款和不可变订单覆盖计算绝对购买日期，再向 `/api/v1/launch/connections/{id}/events` 发送带版本快照。轮询事件直至 `applied`；接收回执本身不是交付。续费和退款重试不能再次增加时长。退款只移除对应订单覆盖；全额退款后重新购买会使用新引用。

无法访问某台设备的用户可打开 Launch 设备管理页。列表、剩余解绑次数、允许动作和操作结果均来自 Licentivo。释放请求携带界面显示的绑定代次及不变的操作 ID。Launch 不另建竞争性的解绑计数器或任务执行器。

## 验证与限制

测试账号交换、身份断言临时存储、SDK 控制的功能执行、普通关闭、新进程明确退出、待处理释放日志和产品与环境隔离。官方 SDK 的真实签名租约、离线检查和篡改拒绝应与 Launch 账号传输分别测试。编译和夹具不能证明生产验收通过。

Launch 还使用 Licentivo V39 的 `session-revocations` POST 和回执 GET 接口，处理桌面退出、强制会话退出、密码修改和账号禁用。原接收方与请求持久固定，响应丢失后可恢复，各环境独立确认。账号范围通知待完成时暂停新的桌面认证；确认后，真正新登录的 `auth_time` 必须严格晚于最新 `revoked_before` 截止秒。网站恢复仍可用。这些通知绝不改变购买日期。参见[职责与恢复契约](/zh/launch-documents/account-purchase-boundary/)。

参见[手动接入](/zh/launch-documents/manual-integration/)、[AI 接入](/zh/launch-documents/ai-integration/)、[接入包](/zh/launch-documents/integration-packages/)和[验收](/zh/launch-documents/acceptance/)。
