---
docStatus: current
---

# 身份映射与权限

区分调用者、接收人、平台用户与外部渠道账号，正确使用 Runtime 授权和渠道用户绑定。

组织能力调用中，执行操作的人、接收消息的人和外部系统中的账号可能不同。参数中填入目标用户，不会授予调用者代表该用户执行的权限。

## 身份各自表示什么

| 身份                    | 含义与来源                       |
| --------------------- | --------------------------- |
| 当前执行用户                | 由已认证调用入口建立，决定本次操作的访问权限。     |
| 工作区成员 `userId`        | 来自成员目录，表示业务目标用户。            |
| 消息参数 `internalUserId` | 接收人的百积木用户 ID；按目标发送方法要求传递。   |
| `channelUserId`       | 渠道实例内的外部账号，由真实入站身份及已启用绑定确认。 |
| `channel`             | 渠道方法要求的真实渠道实例标识，从目录读取。      |
| `sessionKey`          | 渠道侧产生的外部会话键，作为不透明字符串使用。     |
| `sessionId`           | 内部 Agent 会话 ID，与外部会话键含义不同。  |

不同方法可能分别要求整数用户 ID 或字符串用户 ID。按照当前 `methodDefinition` 转换类型，不把姓名、手机号、企微用户 ID 当作百积木用户 ID。

## 调用权限与接收人绑定

发给同事的消息参数可以指向该同事，但执行身份仍来自本次调用。需要同时满足：

1. 调用入口有权调用目标模块方法。
2. 调用方满足目标工作区和方法的访问规则。
3. 接收人的外部账号与平台用户绑定正确、已启用。
4. 所选渠道和会话属于目标工作区，符合发送方法约束。

`getInternalUserBinding` 可按真实 `channel` 和 `internalUserId` 核对渠道绑定。多绑定或多会话时必须明确选择目标，不按“最近活跃”自行猜测业务意图。
`sendExternalSessionMessage` 使用接收人的用户 ID 与外部会话键核验投递目标，不需要调用者手动传入工作区或渠道用户 ID。

## 各入口的身份来源

平台应用通过应用授权和声明的方法调用能力；完整路径见[平台应用调用模块方法](/development/bundle-development/platform-application-development/module-method-calls/)。
工作流使用实例建立的执行主体。业务输入中的接收人 ID 不改变执行主体，也不能通过元数据伪造执行用户。

外部模块后端需要在 ServiceReference 调用中携带当前用户时，遵循[Runtime 用户委托](/development/bundle-development/module-development/actor-delegation/)。
用户委托只在其允许的请求生命周期内使用；延迟任务不能保存本次请求凭据以后重放。

不要自行生成平台身份、复制其他用户凭据，或使用固定管理员处理权限不足。

## 验证与错误定位

区分“方法未授权”“执行用户权限不足”“接收人未绑定”“会话不匹配”四类问题。
先核对执行入口，再核对成员目录、渠道绑定和目标会话；不能用更换用户 ID 或切换到另一渠道掩盖错误。
