认证
NDPR 认证机制详解
概述
NDPR 使用双重认证机制确保 API 访问安全:
认证方式
1. Token 认证
适用于:封禁查询、添加/删除封禁等操作
Bash
# 方式一:JSON Body
curl -X POST http://localhost:5030/bans/add \
-H "Content-Type: application/json" \
-d '{"token": "your_token", "player_id": "player123"}'
# 方式二:Query 参数
curl "http://localhost:5030/bans/download?token=your_token"
2. Key 认证
适用于:Token 管理、权限管理等管理员操作
Bash
# 计算 Key 的 SHA256 哈希
KEY_HASH=$(echo -n "your_admin_key" | sha256sum | cut -d' ' -f1)
# 使用 Key 进行管理操作
curl -X POST http://localhost:5030/token/get \
-H "Content-Type: application/json" \
-d "{
\"uuid\": \"server-001\",
\"mail\": \"admin@example.com\",
\"key\": \"$KEY_HASH\"
}"
密钥配置
编辑配置文件
文件:config/http_key.json
JSON
{
"key": "your_secure_key"
}
<div class="custom-block warning">
<div class="custom-block-title">安全建议</div>
1. 使用强密钥(至少 16 位随机字符)<br>
2. 定期更换密钥<br>
3. 不要将密钥提交到公开仓库
</div>
权限系统
Token 权限
| 权限 | 说明 |
|---|---|
| 无权限 | 只读访问 |
| upload | 可以上传封禁数据 |
权限检查
Bash
curl -X POST http://localhost:5030/token/permission/auth \
-H "Content-Type: application/json" \
-d '{"token": "your_token", "key": "$KEY_HASH"}'
常见认证错误
| 错误 | 原因 | 解决方案 |
|---|---|---|
| Auth failed | Key 哈希不正确 | 重新计算 SHA256 |
| Token not found | Token 不存在 | 检查 Token |
| No permission | 缺少上传权限 | 授予权限 |
| Invalid token format | Token 格式错误 | 检查 Token 格式 |
安全最佳实践
<div class="custom-block tip">
<div class="custom-block-title">安全建议</div>
1. 每个服务器使用独立的 Token<br>
2. 定期轮换 Token 和 Key<br>
3. 使用 HTTPS(生产环境)<br>
4. 限制 API 访问 IP<br>
5. 监控异常访问
</div>
Python 示例
Python
import hashlib
import requests
# 配置
API_URL = "http://localhost:5030"
ADMIN_KEY = "your_admin_key"
SERVER_TOKEN = "your_server_token"
# 计算 Key 哈希
def get_key_hash(key):
return hashlib.sha256(key.encode()).hexdigest()
# 管理操作(需要 Key)
def create_token(uuid, mail):
response = requests.post(
f"{API_URL}/token/get",
json={
"uuid": uuid,
"mail": mail,
"key": get_key_hash(ADMIN_KEY)
}
)
return response.json()
# 一般操作(只需要 Token)
def add_ban(player_id, ip):
response = requests.post(
f"{API_URL}/bans/add",
json={
"token": SERVER_TOKEN,
"player_id": player_id,
"ip": ip,
"online": False
}
)
return response.json()