# `naisi_verify_client_mark`

重新计算客户端信息指纹，并校验完整 18 字符 client mark 的随机段与校验字符。

按生成时的规范化规则和 SHA-256 算法重新计算前 11 位设备摘要；不使用项目私有盐、
内部指纹材料、服务器设备机器指纹、Customer ID、Build ID 或 License ID。
在另一台设备上验证时，必须提供与生成时等价的客户端信息和相同来源。

注意：返回 true 仅说明 mark 的格式、客户端信息指纹、随机段字符集和校验字符有效，
不等于用户已经登录，也不能替代访问令牌、会话校验或服务端授权。浏览器信息变化会使
旧 mark 验证失败。

## 函数签名

```php
function naisi_verify_client_mark(array $client_info, string $client_source, string $input_client_mark): bool
```

## 调用前提

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

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

## 参数

### `$client_info`

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

生成 mark 时使用的客户端信息数组；必需键、最多 256 项及指纹排除项与 naisi_generate_client_mark() 相同。

### `$client_source`

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

生成 mark 时使用的客户端来源；当前版本只接受大小写完全一致的 "web-admin"。

### `$input_client_mark`

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

待验证的完整 18 字符 client mark，不得截断、拼接或重新编码。

## 返回值

类型：`bool`

11 位设备摘要匹配、6 位随机字符均为 [a-z0-9] 且校验字符正确时返回 true；参数无效、未授权、客户端信息变化或校验失败时返回 false。

## 调用示例

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

```php
$clientInfo = [
    'userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/150.0.0.0',
    'language' => 'zh-CN',
    'colorDepth' => 24,
    'pixelRatio' => 1,
    'hardwareConcurrency' => 8,
    'screenResolution' => '1920x1080',
    'availableScreenResolution' => '1920x1040',
    'timezoneOffset' => -480,
    'timezone' => 'Asia/Shanghai',
    'sessionStorage' => true,
    'localStorage' => true,
    'indexedDb' => true,
    'openDatabase' => false,
    'platform' => 'Win32',
    'hasLiedResolution' => false,
    'hasLiedOs' => false,
    'hasLiedBrowser' => false,
    'touchSupport' => false,
];
$error = null;
$clientMark = naisi_generate_client_mark($clientInfo, 'web-admin', $error);
if ($clientMark === null) { throw new RuntimeException('客户端标识生成失败'); }
$result = naisi_verify_client_mark($clientInfo, 'web-admin', $clientMark);
var_dump($result);
```

## 版本信息

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