# 认证与会话管理流程

## 方式一：应用授权（推荐，第三方对接）

用 `app_id` + `app_secret` 登录，无需用户密码。

```
POST {server_url}Kingdee.BOS.WebApi.ServicesStub.AuthService.LoginByAppSecret.common.kdsvc
Content-Type: application/json

[
  "{acct_id}",      // 账套ID
  "{app_id}",       // 应用ID
  "{app_secret}",   // 应用密钥
  2052              // 语言ID（2052=简体中文，1033=English）
]
```

**响应**：
```json
{
  "LoginResultType": 1,    // 1=成功
  "Context": { ... },       // 会话上下文
  ...
}
```

## 方式二：用户密码登录

```
POST {server_url}Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc

[
  "{dbid}",         // 账套ID
  "{user_name}",    // 用户名
  "{password}",     // 密码
  2052              // 语言ID
]
```

## 会话管理

- 登录成功后，服务端下发 Cookie `kdservice-sessionid`
- 后续所有请求建议自动携带该 Cookie（HTTP 客户端的 Cookie 容器自动管理）
- 会话有超时机制，长时间不调用会失效，需重新登录

## 登出

```
POST {server_url}Kingdee.BOS.WebApi.ServicesStub.AuthService.Logout.common.kdsvc
```

## 客户端示例

| 语言 | 客户端骨架 |
|------|-----------|
| Python | [../OpenApiClientPython.py](../OpenApiClientPython.py) `login_by_app_secret()` |
| C# | [../OpenApiClientCsharp.cs](../OpenApiClientCsharp.cs) `LoginByAppSecret()` |
| Java | [../OpenApiClientJava.java](../OpenApiClientJava.java) `loginByAppSecret()` |
