认证

NDPR 认证机制详解

概述

NDPR 使用双重认证机制确保 API 访问安全:

  • Token 认证 - 用于一般 API 调用
  • Key 认证 - 用于管理操作(创建 Token、授权等)
  • 认证方式

    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 failedKey 哈希不正确重新计算 SHA256
    Token not foundToken 不存在检查 Token
    No permission缺少上传权限授予权限
    Invalid token formatToken 格式错误检查 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()