# AuthValidator 授权验证器使用指南 ## 概述 `auth_validator.py` 是一个现代化的软件授权验证器,提供了完整的激活码/卡密验证功能。该验证器采用在线验证模式,确保软件授权的实时性和安全性。 ## 主要功能 1. **在线验证** - 每次启动都进行服务器验证,防止后台禁用后仍能使用 2. **自动保存/读取历史卡密** - 用户无需重复输入卡密 3. **现代化深色主题 UI** - 提供友好的用户界面 4. **机器码一键复制** - 方便用户联系客服 5. **设备绑定管理** - 支持解绑卡密和解绑设备 6. **签名验证** - 使用 SHA256 签名确保请求安全 7. **PyInstaller 支持** - 完美支持打包后的可执行文件 ## 系统要求 ### Python 环境 - Python 3.6 或更高版本 - 依赖库: - `requests` - HTTP 请求 - `customtkinter` - 现代化 UI 框架 ### 安装依赖 ```bash pip install requests customtkinter ``` ### PyInstaller 打包环境 如果使用 PyInstaller 打包,需要添加证书处理: ```bash pip install certifi ``` ## 快速开始 ### 1. 基本使用 在你的 Python 软件入口文件(如 `main.py`)中添加以下代码: ```python #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import os # 添加 auth_validator.py 所在路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # 导入验证器 from auth_validator import AuthValidator def main(): """主程序入口""" # 创建验证器实例 validator = AuthValidator( software_id="YOUR_SOFTWARE_ID", # 你的软件唯一标识 api_url="http://your-server.com/api/v1", # 授权服务器地址 secret_key="YOUR_SECRET_KEY" # 授权密钥(与服务器配置一致) ) # 执行验证 if not validator.validate(): # 验证失败,退出程序 print("授权验证失败,程序将退出。") sys.exit(1) # 验证成功,继续执行主程序 print("授权验证成功,欢迎使用!") # ... 你的主程序逻辑 ... if __name__ == '__main__': main() ``` ### 2. 配置参数说明 | 参数 | 类型 | 必需 | 说明 | |------|------|------|------| | `software_id` | string | 是 | 软件唯一标识符,与服务器产品ID一致 | | `api_url` | string | 是 | 授权服务器 API 地址,如 `http://localhost:5000/api/v1` | | `secret_key` | string | 是 | 授权密钥,与服务器配置一致 | | `timeout` | int | 否 | 请求超时时间(秒),默认 5 | ## 详细使用说明 ### 初始化验证器 ```python from auth_validator import AuthValidator validator = AuthValidator( software_id="my_software", api_url="http://license.example.com/api/v1", secret_key="my_secret_key_12345", timeout=10 # 可选,设置超时时间为10秒 ) ``` ### 执行验证 ```python # 阻塞式验证,会弹出现代化 UI 窗口 is_valid = validator.validate() if is_valid: print("验证成功!") # 继续执行主程序 else: print("验证失败!") # 退出程序 sys.exit(1) ``` ### 验证流程 1. **启动 UI 窗口** - 显示现代化深色主题界面 2. **读取历史卡密** - 自动填入上次使用的卡密(如果有) 3. **自动验证** - 如果有历史卡密,自动进行验证 4. **手动验证** - 用户可以输入新卡密并点击验证 5. **验证结果** - 根据服务器返回结果显示成功或失败 6. **保存卡密** - 验证成功后自动保存卡密供下次使用 ## 高级功能 ### 1. 机器码管理 验证器会自动生成稳定的机器码,基于以下信息: - 主机名 - 操作系统架构 - MAC 地址 - Windows UUID(如果是 Windows 系统) 机器码会缓存到 `.machine_id` 文件中,确保同一台机器的机器码保持不变。 ### 2. 配置管理 验证器会自动管理以下配置: - `auth_config.json` - 保存最后一次成功的卡密 - `.auth_{software_id}.token` - 保存验证成功后的 Token 数据 ### 3. 解绑功能 验证器提供两种解绑方式: #### 解绑当前卡密 用户可以在 UI 中点击"解绑当前卡密"按钮,解除卡密与设备的绑定。 #### 解绑当前设备 用户可以在 UI 中点击"解绑当前设备"按钮,解除当前设备与所有卡密的绑定。 ### 4. 签名验证 所有 API 请求都使用 SHA256 签名验证,确保请求的安全性: ``` 签名数据 = software_id + license_key + machine_code + timestamp 签名 = SHA256(签名数据 + secret_key) ``` 时间戳有效期为 5 分钟,防止重放攻击。 ## API 接口 验证器会调用以下服务器 API: ### 1. 验证卡密 **端点:** `POST /auth/verify` **请求参数:** ```json { "software_id": "string", "license_key": "string", "machine_code": "string", "timestamp": "integer", "signature": "string", "software_version": "string" } ``` **响应示例:** ```json { "success": true, "message": "验证成功", "data": { "license_key": "XXXXX-XXXXX-XXXXX-XXXXX", "type": 1, "type_name": "正式", "expire_time": "2025-12-31T23:59:59", "remaining_days": 365, "product_name": "我的软件" } } ``` ### 2. 解绑卡密 **端点:** `POST /auth/unbind` **请求参数:** ```json { "software_id": "string", "license_key": "string", "machine_code": "string", "timestamp": "integer", "signature": "string" } ``` ### 3. 解绑设备 **端点:** `POST /auth/unbind_device` **请求参数:** ```json { "software_id": "string", "machine_code": "string", "timestamp": "integer", "signature": "string" } ``` ## 错误处理 ### 常见错误及解决方案 1. **无法连接到服务器** - 检查 `api_url` 是否正确 - 检查网络连接 - 检查服务器是否运行 2. **签名验证失败** - 检查 `secret_key` 是否正确 - 检查时间是否同步 3. **卡密不存在** - 检查 `license_key` 是否正确 - 检查卡密是否属于该软件 4. **卡密已过期** - 联系管理员续费 - 使用新的卡密 ### 错误示例 ```python try: validator = AuthValidator( software_id="my_software", api_url="http://localhost:5000/api/v1", secret_key="wrong_key" ) if validator.validate(): print("验证成功") else: print("验证失败,程序退出") sys.exit(1) except Exception as e: print(f"验证器初始化失败: {e}") sys.exit(1) ``` ## PyInstaller 打包 ### 1. 打包命令 ```bash pyinstaller --onefile --windowed --name="MySoftware" main.py ``` ### 2. 特殊处理 验证器已经内置了 PyInstaller 支持,会自动处理以下问题: - SSL 证书问题 - 资源文件路径 - 临时文件清理 ### 3. 打包后测试 ```bash # 在打包后的目录中测试 ./dist/MySoftware ``` ## 部署到生产环境 ### 1. 服务器端配置 确保授权服务器已正确配置: - 部署 KaMiXiTong 授权管理系统 - 配置产品信息 - 生成卡密 - 设置 `AUTH_SECRET_KEY` 环境变量 ### 2. 客户端配置 在客户端软件中: - 设置正确的 `software_id`(与服务器产品ID一致) - 设置正确的 `api_url`(授权服务器地址) - 设置正确的 `secret_key`(与服务器一致) ### 3. 测试验证 在部署前进行充分测试: - 测试有效卡密验证 - 测试无效卡密拒绝 - 测试过期卡密处理 - 测试解绑功能 - 测试网络异常处理 ## 安全建议 1. **保护密钥** - 不要将 `secret_key` 硬编码在代码中,应使用配置文件或环境变量 2. **定期更新** - 定期更新软件和验证器版本 3. **日志监控** - 监控验证日志,及时发现异常 4. **备份策略** - 定期备份卡密数据库 5. **网络安全** - 使用 HTTPS 保护 API 通信 ## 故障排除 ### 1. UI 界面无法显示 ```python # 检查是否安装了 customtkinter import customtkinter as ctk print(ctk.__version__) ``` ### 2. 网络请求失败 ```python # 测试网络连接 import requests try: response = requests.get("http://your-server.com/api/v1/auth/verify", timeout=5) print("网络连接正常") except Exception as e: print(f"网络连接失败: {e}") ``` ### 3. 机器码问题 ```python # 清除机器码缓存,重新生成 import os if os.path.exists(".machine_id"): os.remove(".machine_id") print("机器码缓存已清除,重启程序后重新生成") ``` ### 4. 配置问题 ```python # 清除所有缓存,重新配置 import os files_to_remove = ["auth_config.json", ".machine_id", ".auth_my_software.token"] for file in files_to_remove: if os.path.exists(file): os.remove(file) print(f"已删除: {file}") ``` ## 示例项目 完整的示例项目结构: ``` my_software/ ├── main.py # 主程序入口 ├── auth_validator.py # 验证器文件 ├── config.py # 配置文件 ├── requirements.txt # 依赖列表 ├── build.py # 打包脚本 └── README.md # 使用说明 ``` ### requirements.txt ``` requests>=2.25.0 customtkinter>=5.0.0 pyinstaller>=4.0 ``` ### main.py 示例 ```python #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import os from auth_validator import AuthValidator def load_config(): """加载配置""" # 从环境变量或配置文件读取 return { 'software_id': os.getenv('SOFTWARE_ID', 'my_software'), 'api_url': os.getenv('API_URL', 'http://localhost:5000/api/v1'), 'secret_key': os.getenv('SECRET_KEY', 'your_secret_key') } def main(): """主程序入口""" # 加载配置 config = load_config() # 创建验证器 validator = AuthValidator(**config) # 执行验证 print("正在验证软件授权...") if not validator.validate(): print("授权验证失败!") sys.exit(1) print("授权验证成功!") # ... 你的主程序逻辑 ... if __name__ == '__main__': main() ``` ## 技术支持 如有问题,请联系: - 邮箱:support@example.com - QQ:123456789 - 微信:taiyi1224 ## 更新日志 ### v1.0.0 (2025-12-27) - 初始版本发布 - 支持在线验证 - 支持现代化 UI - 支持 PyInstaller 打包 - 支持解绑功能 ## 许可证 本软件仅供学习和研究使用,请遵守相关法律法规。 --- **Powered by AuthValidator** - 专业的软件授权验证解决方案