Skip to content

Commit d16352a

Browse files
feat: API configuration documentation
1 parent 5f5fa83 commit d16352a

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

docs/dev_manual/api_manual.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
## API 接口配置与使用指南
2+
3+
本文档详细介绍了如何在三方服务中使用自定义 Token 的验证来访问面板接口。
4+
5+
### 以下内容已通过 Swagger 进行验证
6+
7+
面板 swagger 访问地址:`{host}:{port}/1panel/swagger/index.html`
8+
9+
### 自定义 Token 格式
10+
11+
我们设计了以下自定义 Token 格式,用于接口请求的身份验证:
12+
13+
```text
14+
Token = md5('1panel' + API-Key + UnixTimestamp)
15+
```
16+
17+
组成部分:
18+
19+
- 固定前缀: '1panel'
20+
- API-Key: 面板 API 接口密钥
21+
- UnixTimestamp: 当前的时间戳(秒级)
22+
23+
### 请求 Header 设计
24+
25+
每次请求必须携带以下两个 Header:
26+
27+
| Header 名称 | 说明 |
28+
|------------------|--------------------|
29+
| 1Panel-Token | 自定义的 Token 值 |
30+
| 1Panel-Timestamp | 当前时间戳 |
31+
32+
### 示例请求头:
33+
34+
```bash
35+
curl -X GET "http://localhost:4004/api/v1/dashboard/current" \
36+
-H "1Panel-Token: <1panel_token>" \
37+
-H "1Panel-Timestamp: <current_unix_timestamp>"
38+
```
39+
40+
### 示例实现代码(go)
41+
42+
```go
43+
func validateToken(c *gin.Context) error {
44+
panelToken := c.GetHeader("1Panel-Token")
45+
panelTimestamp := c.GetHeader("1Panel-Timestamp")
46+
systemToken := panelToken
47+
systemKey = ******* // 面板 API 密钥
48+
expectedToken := md5Sum("1panel" + systemKey + panelTimestamp)
49+
if systemToken != expectedToken {
50+
return fmt.Errorf("invalid token")
51+
}
52+
return nil
53+
}
54+
55+
func md5Sum(data string) string {
56+
h := md5.New()
57+
h.Write([]byte(data))
58+
return hex.EncodeToString(h.Sum(nil))
59+
}
60+
```
61+
62+
## 注意事项
63+
64+
1. 时间戳的有效性:
65+
需要确保服务器与客户端时间同步,否则会导致验证失败。建议使用 NTP 同步时间。
66+
67+
2. 白名单使用:
68+
将可信任的 IP 或 IP 段加入白名单,避免频繁 Token 验证的开销;如需放行所有 IP ,可以配置 `0.0.0.0`
69+
70+
## 常见问题
71+
72+
1. Q: 如果 1Panel-Token或1Panel-Timestamp 错误怎么办?
73+
A: 返回 401 Unauthorized,提示 "API 接口密钥错误"。
74+
75+
2. Q: 如何生成 1Panel-Token?
76+
A: 参考以下伪代码:
77+
78+
```javascript
79+
const token = md5('1panel' + clientToken + unixTimestamp);
80+
```
81+
82+
3. Q: 为什么需要两个 Header?
83+
A: 提高验证的复杂度,同时增强安全性。
84+
85+
## 结语
86+
87+
通过上述方式可以实现一个安全、高效的 Token 验证系统。如果有任何问题,请参考具体代码实现或联系我们获取支持。

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ nav:
127127
- 操作系统相关: faq/operating_system.md
128128
- 系统功能相关: faq/system_function.md
129129
- 服务器架构相关: faq/server_architecture.md
130+
- API 接口: dev_manual/api_manual.md
130131
- 版本迭代: changelog.md
131132
- 联系我们: contact.md
132133

0 commit comments

Comments
 (0)