|
| 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 验证系统。如果有任何问题,请参考具体代码实现或联系我们获取支持。 |
0 commit comments