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