|
|
# 密码验证与系统设置接口文档
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
本模块提供密码验证、会话管理以及系统时间设置功能。设备运行在离线环境下,通过密码保护敏感操作,会话有效期为 30 分钟。
|
|
|
|
|
|
---
|
|
|
|
|
|
## 一、密码验证
|
|
|
|
|
|
### 1.1 验证密码
|
|
|
|
|
|
验证操作密码,成功后返回 session_id,后续请求携带该 ID 即可免密访问。
|
|
|
|
|
|
#### Method
|
|
|
|
|
|
- `/m9z/password/verify`
|
|
|
|
|
|
#### 请求参数示例
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"method": "/m9z/password/verify",
|
|
|
"params": {
|
|
|
"password": "000000"
|
|
|
},
|
|
|
"timestampin": "1743523200000"
|
|
|
}
|
|
|
```
|
|
|
|
|
|
#### 参数说明
|
|
|
|
|
|
| 参数名 | 类型 | 说明 | 必填 | 备注 |
|
|
|
|---------|------|--------|----|--------------|
|
|
|
| password | string | 操作密码 | 是 | 首次默认值为 000000 |
|
|
|
|
|
|
#### 成功响应示例
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"result": {
|
|
|
"success": true,
|
|
|
"session_id": "a1b2c3d4e5f6...",
|
|
|
"message": "verified"
|
|
|
},
|
|
|
"error": {
|
|
|
"message": "ok",
|
|
|
"code": 200
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
#### 错误响应示例(密码错误)
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"result": null,
|
|
|
"error": {
|
|
|
"message": "invalid password",
|
|
|
"code": 401
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
### 1.2 修改密码
|
|
|
|
|
|
修改操作密码,需要提供原密码。
|
|
|
|
|
|
#### Method
|
|
|
|
|
|
- `/m9z/password/change`
|
|
|
|
|
|
#### 请求参数示例
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"method": "/m9z/password/change",
|
|
|
"params": {
|
|
|
"old_password": "000000",
|
|
|
"new_password": "123456"
|
|
|
},
|
|
|
"timestampin": "1743523200000"
|
|
|
}
|
|
|
```
|
|
|
|
|
|
#### 参数说明
|
|
|
|
|
|
| 参数名 | 类型 | 说明 | 必填 | 备注 |
|
|
|
|-------------|------|------|----|------------|
|
|
|
| old_password | string | 原密码 | 是 | |
|
|
|
| new_password | string | 新密码 | 是 | 至少 6 位字符 |
|
|
|
|
|
|
#### 成功响应示例
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"result": {
|
|
|
"success": true,
|
|
|
"message": "password changed"
|
|
|
},
|
|
|
"error": {
|
|
|
"message": "ok",
|
|
|
"code": 200
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
#### 错误响应示例(原密码错误)
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"result": null,
|
|
|
"error": {
|
|
|
"message": "old password incorrect",
|
|
|
"code": 401
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
#### 错误响应示例(新密码太短)
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"result": null,
|
|
|
"error": {
|
|
|
"message": "new password must be at least 6 characters",
|
|
|
"code": 400
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 二、会话认证机制
|
|
|
|
|
|
### 2.1 工作流程
|
|
|
|
|
|
1. 前端首次访问时,弹出密码输入框
|
|
|
2. 调用 `/m9z/password/verify` 获取 `session_id`
|
|
|
3. 将 `session_id` 存储在本地(localStorage)
|
|
|
4. 后续所有需要认证的请求,在请求中携带 `session_id`
|
|
|
|
|
|
### 2.2 请求携带 session_id
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"method": "/m9z/device/setMode",
|
|
|
"params": {
|
|
|
"mode": 1
|
|
|
},
|
|
|
"session": "a1b2c3d4e5f6...",
|
|
|
"timestampin": "1743523200000"
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 2.3 认证失败响应
|
|
|
|
|
|
当 session_id 过期或未提供时,接口返回 401 错误,前端应引导用户重新输入密码。
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"result": null,
|
|
|
"error": {
|
|
|
"message": "session expired or invalid",
|
|
|
"code": 401
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 2.4 会话有效期
|
|
|
|
|
|
- 默认有效期:30 分钟
|
|
|
- 每次验证成功后刷新有效期
|
|
|
- 过期后需重新输入密码
|
|
|
|
|
|
---
|
|
|
|
|
|
## 三、白名单接口
|
|
|
|
|
|
以下接口无需密码验证即可访问:
|
|
|
|
|
|
| Method 前缀 | 说明 |
|
|
|
|-----------------------|-----------------|
|
|
|
| `/m9z/password/*` | 密码相关接口 |
|
|
|
| `/m9z/get*` | 所有读取接口 |
|
|
|
| `/m9z/fault*` | 故障相关接口 |
|
|
|
| `/m9z/system/getTime` | 获取系统时间 |
|
|
|
|
|
|
---
|
|
|
|
|
|
## 四、系统时间设置
|
|
|
|
|
|
### 4.1 获取系统时间
|
|
|
|
|
|
获取当前设备系统时间,用于前端校准显示。
|
|
|
|
|
|
#### Method
|
|
|
|
|
|
- `/m9z/system/getTime`
|
|
|
|
|
|
#### 请求参数示例
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"method": "/m9z/system/getTime",
|
|
|
"params": {},
|
|
|
"session": "a1b2c3d4e5f6...",
|
|
|
"timestampin": "1743523200000"
|
|
|
}
|
|
|
```
|
|
|
|
|
|
#### 成功响应示例
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"result": {
|
|
|
"timestamp": 1743523200,
|
|
|
"datetime": "2026-04-01 12:00:00",
|
|
|
"timezone": "Local"
|
|
|
},
|
|
|
"error": {
|
|
|
"message": "ok",
|
|
|
"code": 200
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
#### 响应参数说明
|
|
|
|
|
|
| 参数名 | 类型 | 说明 | 备注 |
|
|
|
|---------|--------|-----------|--------------|
|
|
|
| timestamp | int64 | Unix 时间戳 | 秒级 |
|
|
|
| datetime | string | 日期时间字符串 | 格式:YYYY-MM-DD HH:mm:ss |
|
|
|
| timezone | string | 时区信息 | Local 表示本地时区 |
|
|
|
|
|
|
---
|
|
|
|
|
|
### 4.2 设置系统时间
|
|
|
|
|
|
修改设备系统时间。设备运行在离线环境时,用于手动校准时间。
|
|
|
|
|
|
#### Method
|
|
|
|
|
|
- `/m9z/system/setTime`
|
|
|
|
|
|
#### 请求参数示例
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"method": "/m9z/system/setTime",
|
|
|
"params": {
|
|
|
"datetime": "2026-04-01 14:30:00"
|
|
|
},
|
|
|
"session": "a1b2c3d4e5f6...",
|
|
|
"timestampin": "1743523200000"
|
|
|
}
|
|
|
```
|
|
|
|
|
|
#### 参数说明
|
|
|
|
|
|
| 参数名 | 类型 | 说明 | 必填 | 备注 |
|
|
|
|---------|------|------|----|-----------------------------------|
|
|
|
| datetime | string | 目标时间 | 是 | 支持多种格式,见下方说明 |
|
|
|
|
|
|
#### 支持的时间格式
|
|
|
|
|
|
| 格式 | 示例 |
|
|
|
|---------------------------|-------------------|
|
|
|
| YYYY-MM-DD HH:mm:ss | 2026-04-01 14:30:00 |
|
|
|
| YYYY-MM-DDTHH:mm:ssZ | 2026-04-01T14:30:00Z |
|
|
|
| YYYY-MM-DD HH:mm | 2026-04-01 14:30 |
|
|
|
| YYYY-MM-DD | 2026-04-01 |
|
|
|
|
|
|
#### 成功响应示例
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"result": {
|
|
|
"success": true,
|
|
|
"message": "system time updated",
|
|
|
"old_time": "2026-04-01 14:25:30",
|
|
|
"new_time": "2026-04-01 14:30:00",
|
|
|
"unix_time": 1743531000
|
|
|
},
|
|
|
"error": {
|
|
|
"message": "ok",
|
|
|
"code": 200
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
#### 响应参数说明
|
|
|
|
|
|
| 参数名 | 类型 | 说明 | 备注 |
|
|
|
|---------"|--------|--------|------------|
|
|
|
| success | bool | 是否成功 | |
|
|
|
| message | string | 状态信息 | |
|
|
|
| old_time | string | 修改前时间 | 格式同上 |
|
|
|
| new_time | string | 修改后时间 | 格式同上 |
|
|
|
| unix_time | int64 | 新时间戳 | 秒级 |
|
|
|
|
|
|
#### 错误响应示例(格式错误)
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"result": null,
|
|
|
"error": {
|
|
|
"message": "invalid datetime format, supported: 2006-01-02 15:04:05, 2006-01-02T15:04:05Z, 2006-01-02 15:04, 2006-01-02",
|
|
|
"code": 400
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
#### 错误响应示例(未提供时间)
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"jsonrpc": "2.0",
|
|
|
"result": null,
|
|
|
"error": {
|
|
|
"message": "datetime is required",
|
|
|
"code": 400
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 五、注意事项
|
|
|
|
|
|
### 5.1 权限要求
|
|
|
|
|
|
- 设置系统时间需要 root 权限,应用需以 root 方式运行
|
|
|
|
|
|
### 5.2 NTP 设置
|
|
|
|
|
|
- 设置时间时会自动关闭 NTP 同步,防止时间被覆盖
|
|
|
- 设置完成后会自动同步到硬件时钟(RTC)
|
|
|
|
|
|
### 5.3 存储位置
|
|
|
|
|
|
- 密码数据存储在:`程序目录/data/m9zTtyPwd.json`
|
|
|
- 密码使用 SHA256 + 自定义盐值加密存储
|
|
|
|
|
|
### 5.4 建议的前端实现
|
|
|
|
|
|
```javascript
|
|
|
// 1. 初始化时检查 session
|
|
|
let sessionId = localStorage.getItem('m9z_session_id');
|
|
|
|
|
|
// 2. 封装请求方法,自动携带 session
|
|
|
async function callRpc(method, params = {}) {
|
|
|
const response = await fetch('/jsonrpc', {
|
|
|
method: 'POST',
|
|
|
headers: { 'Content-Type': 'application/json' },
|
|
|
body: JSON.stringify({
|
|
|
jsonrpc: '2.0',
|
|
|
method,
|
|
|
params,
|
|
|
session: sessionId,
|
|
|
timestampin: Date.now().toString()
|
|
|
})
|
|
|
});
|
|
|
const data = await response.json();
|
|
|
|
|
|
// 3. 处理认证失败
|
|
|
if (data.error?.code === 401) {
|
|
|
// 弹出密码输入框
|
|
|
sessionId = null;
|
|
|
localStorage.removeItem('m9z_session_id');
|
|
|
showPasswordDialog();
|
|
|
throw new Error('session expired');
|
|
|
}
|
|
|
|
|
|
return data;
|
|
|
}
|
|
|
|
|
|
// 4. 密码验证成功后保存 session
|
|
|
async function verifyPassword(password) {
|
|
|
const res = await callRpc('/m9z/password/verify', { password }, true);
|
|
|
if (res.result?.success) {
|
|
|
sessionId = res.result.session_id;
|
|
|
localStorage.setItem('m9z_session_id', sessionId);
|
|
|
}
|
|
|
return res;
|
|
|
}
|
|
|
```
|