---
description: 记录各类访问令牌和登录凭证，用于鉴权和 Session 绑定。
navTitle: ACCESS_TOKENS
---
# **ACCESS\_TOKENS 认证令牌表**

此表用于存储系统中有多种来源的访问凭证，如：OAuth2 授信应用签发的 token、系统内部生成的临时 token 等。除了Personal Access Token (PAT) 在  [PERSONAL\_ACCESS\_TOKENS](PERSONAL_ACCESS_TOKENS.tbl.md) 中存储以外，
系统内部所有的访问凭证都存储在该表中。

## 位置{#position}

模型路径：`/sysdata/data/tables/sec/ACCESS_TOKENS.tbl`

物理表名：`SZSYS_5_ACCESS_TOKENS`

## 表结构{#structure}

| 字段名 | 字段类型 | 字段描述 |
| :----  | :---- | :------ |
| ACCESS\_TOKEN | VARCHAR(64) | 主键，凭证值。所有 token 均由系统随机生成（UUID） |
| SOURCE\_TYPE | VARCHAR(32) | 凭证来源类型，见 [SOURCE\_TYPE 取值](#source-type-values) |
| USER\_ID | VARCHAR(32) | 凭证对应的用户 ID |
| USER\_DIRECTORY | VARCHAR(16) | 用户目录，`sys` 系统用户、`external` 外部用户，不填默认为 `sys` |
| SSOID | VARCHAR(128) | 签发此凭证的 SSO 提供者 ID（如 `wechat_oa`），单点登录有此字段，用于追溯登录来源 |
| ENABLED | NUMBER(1) | 是否启用。`1` 有效，`0` 已禁用或已吊销。与过期时间是两个独立维度：token 未过期但 `ENABLED != 1` 也无法使用 |
| APP\_ID | VARCHAR(32) | 授信应用 ID，仅 OAuth2 和客户端凭证 token 有此值，关联 `SZSYS_5_TRUSTED_APPS` |
| APP\_NAME | VARCHAR(128) | 授信应用名称，冗余存储方便查询 |
| SESSION\_ID | VARCHAR(64) | 凭证创建 Session 后回写的会话 ID。未创建 Session 前为空，创建后写入，后续请求通过此字段判断是否已有可用会话 ，用于 Session 会话复用 |
| EXPIRE\_TIME | TIMESTAMP | 凭证过期时间 |
| CREATE\_TIME | TIMESTAMP | 凭证创建时间 |

## 表索引{#indexes}

| 类型 | 名称 | 字段列表 | 是否唯一 | 说明 |
| :---- | :---- | :---- | :------ | :------ |
| 主键 | PRIMARY | ACCESS\_TOKEN | 是 | 唯一标识一条凭证记录 |

## 快速理解{#overview}

| 凭证类型 | 用途 | 典型场景 |
| :--- | :--- | :--- |
| OAuth2 access token | 第三方应用调用开放 API | 第三方应用后端 API 调用 |
| 客户端凭证 token | 可信服务器代入用户身份调用接口 | 系统间集成 |
| 证书凭证 token | 使用证书认证的可信服务器代入用户身份调用接口 | 高安全要求的系统间集成 |
| 系统内部 token | 系统自动生成的临时凭证（API、调试、截图、扫码预览等） | 内部服务 |

上述凭证共用同一个鉴权入口（Bearer 头或 URL 参数 `access_token`），系统根据 SOURCE\_TYPE 采用不同的校验规则。

## SOURCE\_TYPE 取值{#source-type-values}

| SOURCE\_TYPE | 凭证类型 | 创建 Session | 使用后删除 |
| :--- | :------- | :----------- | :--------- |
| `authorization_code` | OAuth2 access token | 是 | 否 |
| `client_credentials` | 客户端凭证 token | 是 | 否 |
| `personal_temp` | 页面跳转登录 token（signin / getAccessToken） | 是 | 是 |
| `sys_script` | 脚本生成凭证 | 是 | 否 |
| `sys_nodejs` | NodeRunner 调试 token | 是 | 否 |
| `sys_screenshot` | 截图服务 token | 是 | 否 |
| `sys_mobile_preview` | 移动端预览 token | 是 | 否 |

## 各类型凭证说明{#storage-pattern}

### OAuth2 access token：`SOURCE_TYPE = authorization_code`

第三方应用通过 OAuth2 授权流程获取的接口凭证。授权码和刷新令牌存储在 [REFRESH\_TOKENS](REFRESH_TOKENS.tbl.md)，本表只存 access\_token。

用户授权后，系统在 REFRESH\_TOKENS 中消费授权码，在本表写入 access\_token 行。access\_token 可用于调用开放 API，也可用于创建 Session。刷新 token 时本表的 ACCESS\_TOKEN 和过期时间会更新。允许多次使用。

### 客户端凭证 token：`SOURCE_TYPE = client_credentials`

服务端到服务端集成的凭证，第三方系统以自身应用身份代入指定用户调用接口，整个过程无需浏览器跳转或用户交互。系统签发前会依次校验：授信应用是否启用、`APP_SECRET` 是否匹配、请求来源 IP 是否在白名单内、被代入用户是否属于授信应用配置的用户组范围。该 token 记录的是"应用身份 + 用户身份"的组合——`APP_ID` / `APP_NAME` 标识授信应用来源，`USER_ID` / `USER_DIRECTORY` 标识实际代入的用户；首次鉴权创建 Session 后会回写 `SESSION_ID`，后续请求复用同一会话。

### 系统内部 token

系统内部自动生成的临时凭证，便于排查和审计。

| SOURCE\_TYPE | 生成来源 | 是否一次性 | 说明 |
| :--- | :--- | :--- | :--- |
| `personal_temp` | signin 非 AJAX / getAccessToken | 是 | 拼在 URL 上做页面跳转登录，用后立即删除，防止任何人拿到 URL 重复登录 |
| `sys_nodejs` | 后端使用命令行调用nodejs编译元数据 | 否 | VSCode 调试注入，调试会话期间可重复使用 |
| `sys_screenshot` | 生成缩略图 | 否 | 服务端截图，批量导出时同一 token 可能需要多次渲染 |
| `sys_mobile_preview` | 手机扫码仪版、报表等生成的二维码页预览对应的页面 | 否 | 扫码预览、二维码访问，同一个二维码需支持多人扫描 |
| `sys_script` | security.createAccessToken | 否 | 服务端脚本为指定用户生成凭证，允许多次使用，需脚本自行管理生命周期 |

## 过期时间规范{#ttl-spec}

| SOURCE\_TYPE | 有效期 | 说明 |
| :--- | :--- | :--- |
| `authorization_code` | 8 小时（28800 秒） | OAuth2 access\_token，参考 GitHub OAuth2 规范，用于 `expires_in` 属性 |
| `client_credentials` | 8 小时（28800 秒） | 客户端凭证 token，同 OAuth2 规范 |
| `sys_script` | 8 小时（28800 秒） | 服务端脚本生成凭证，与 OAuth2 token 一致 |
| `personal_temp`、`sys_nodejs`、`sys_screenshot`、`sys_mobile_preview` | 10 分钟 | 页面跳转/编译/截图/扫码预览等一次性或短生命周期场景 |

## 数据示例{#row-examples}

| ACCESS\_TOKEN | SOURCE\_TYPE | USER\_ID | USER\_DIRECTORY | APP\_ID | EXPIRE\_TIME | CREATE\_TIME | ENABLED  |
| :-- | :-- | :-- | :-- | :-- | :-- | :-- |:--
| `e7f3a9c2-4b1d-4e8a-9c3f-2d7b8a1e6f54` | `authorization_code` | `u001` | `sys` | `app001` | `2026-06-10 12:00:00` | `2026-06-10 10:00:00` | `1` |
| `f2b8c4d6-1e3a-4f9b-8d2c-5a7e0b3f1d98` | `personal_temp` | `u002` | `sys` | | `2026-06-10 10:10:00` | `2026-06-10 10:00:00` | `1` |
| `a3d5e7f9-2b4c-4d6e-8f1a-3b5c7d9e2f46` | `sys_mobile_preview` | `u003` | `sys` | | `2026-06-10 10:10:00` | `2026-06-10 10:00:00` | `1` |
| `d8c7b6a5-4e3f-2d1c-9b8a-7f6e5d4c3b2a` | `client_credentials` | `u004` | `sys` | `app002` | `2026-06-10 12:00:00` | `2026-06-10 10:00:00` | `1` |

## 相关表{#related-tables}

- [REFRESH\_TOKENS](REFRESH_TOKENS.tbl.md)：存储 OAuth2 授权码和刷新令牌。授权码消费后写入本表 access\_token，刷新令牌用于轮换 access\_token。
- [PERSONAL\_ACCESS\_TOKENS](PERSONAL_ACCESS_TOKENS.tbl.md)：存储 PAT 的资产信息（名称、描述、启停状态）。

## 使用注意{#notice}

1. `ACCESS_TOKEN` 可直接代表访问身份，不应导出、展示或写入日志。
2. `personal_temp` 是唯一一次性 token：拼在 URL 上做页面跳转登录，用后立即原子删除，防止 replay 攻击。其他类型（`authorization_code`、`client_credentials`、`sys_script`、`sys_nodejs`、`sys_screenshot`、`sys_mobile_preview`）不删，过期前可多次使用。
3. `SESSION_ID` 通过记录此字段来保证相同的access\_token在不同的请求中可以复用会话。
4. 令牌属于敏感凭证，不应导出、展示或写入日志。
