# `naisi_create_access_token`

创建访问令牌。

SaaS 模式下 payload 必须显式包含 int 型 tenant_code：0 表示平台作用域，正整数须获租户许可；已有可信租户时不得跨租户签发。
entcustom 模式不要求业务传入 tenant_code，忽略该字段且不建立租户绑定。
本函数不会建立当前请求的可信租户上下文，失败返回 false。

## 函数签名

```php
function naisi_create_access_token(string $client_mark, array $payload, string $ip, string $salt, int $expired): false|string
```

## 调用前提

应用入口先调用 [naisi_is_ext_license_valid](/web/developers/naisilib/naisi-is-ext-license-valid) 并确认返回 `true`。认证 Agent 发布的许可与 heartbeat 快照，并建立或复用本请求的 BASIC 证明；不会读取许可文件或检查当前 Host。

授权类别：`LICENSE_EXPLICIT_TENANT`；执行模式：`BASIC`。许可不代替登录、租户或权限上下文；身份与数据要求见本页参数及用途说明。

## 参数

### `$client_mark`

- 类型：`string`
- 必填：是
- 默认值：无
- 方向：输入参数。

固定 18 位 [a-z0-9] 标识：11 位设备摘要、6 位可重复随机字符、1 位校验字符。

### `$payload`

- 类型：`array`
- 必填：是
- 默认值：无
- 方向：输入参数。

需要签发、编码或认证的载荷数据；访问令牌 identity 只接受五个严格小写身份名，permission 必须为非空字符串。

### `$ip`

- 类型：`string`
- 必填：是
- 默认值：无
- 方向：输入参数。

需要检查、分类或绑定的 IPv4 或 IPv6 地址。

### `$salt`

- 类型：`string`
- 必填：是
- 默认值：无
- 方向：输入参数。

恰好 16 字节的业务盐；密钥由扩展从内部 AES 密钥库随机选择。

### `$expired`

- 类型：`int`
- 必填：是
- 默认值：无
- 方向：输入参数。

令牌的过期时间或有效期秒数，具体语义由令牌协议规定。

## 返回值

类型：`false|string`

成功时返回结果字符串，失败时返回 false。

## 调用示例

当前请求须满足上方调用前提；请检查实际返回值和引用输出，随机结果及数据包内容以运行环境为准。

```php
// 先在当前请求完成许可验证；client mark 来自已验证的客户端信息。
$payload = ['uid' => 100000006, 'mark' => '69f462ee2decd40ec12d',
    'identity' => 'root', 'permission' => 'order.read', 'tenant_code' => 0];
$salt = '1234567890abcdef'; // 恰好 16 字节，验证端须使用相同值
$token = naisi_create_access_token($clientMark, $payload, $ip, $salt, 1800);
if ($token === false) { throw new RuntimeException('签发失败'); }
```

## 升级说明

当前签名用 16 字节的 `$salt` 字符串替代 `$encryption_config` 数组；密钥由扩展从内部 AES 密钥库选择。签发端和验证端须使用相同业务盐。旧调用需修改，已有令牌或 Credential 应重新签发并验证兼容性。

## 版本信息

- 自版本：`1.0.6`
- 实现模块：`auth`
- 授权类别：`LICENSE_EXPLICIT_TENANT` / `BASIC`
- 失败回退：`false`
- 文档同步：`2026-10-18`
