惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tenable Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
I
Intezer
Hacker News - Newest:
Hacker News - Newest: "LLM"
Hacker News: Ask HN
Hacker News: Ask HN
Schneier on Security
Schneier on Security
H
Heimdal Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Cyberwarzone
Cyberwarzone
V2EX - 技术
V2EX - 技术
W
WeLiveSecurity
Help Net Security
Help Net Security
S
Secure Thoughts
P
Privacy & Cybersecurity Law Blog
S
Securelist
SecWiki News
SecWiki News
P
Palo Alto Networks Blog
C
CERT Recently Published Vulnerability Notes
Know Your Adversary
Know Your Adversary
The Last Watchdog
The Last Watchdog
N
News | PayPal Newsroom
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
H
Hacker News: Front Page
NISL@THU
NISL@THU
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
Attack and Defense Labs
Attack and Defense Labs
Security Archives - TechRepublic
Security Archives - TechRepublic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Google Online Security Blog
Google Online Security Blog
The Hacker News
The Hacker News
Cloudbric
Cloudbric
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
N
News and Events Feed by Topic
A
Arctic Wolf
Latest news
Latest news
S
Schneier on Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
Project Zero
Project Zero
P
Privacy International News Feed
B
Blog
云风的 BLOG
云风的 BLOG

运维开发绿皮书

OBS虚拟摄像头重命名 Ubuntu备份为LiveOS 使用Powershell卸载windows默认程序 Cisco路由器OSPF配置 汽车的分类和特点 Windows11跳过TPM2.0 HTTPS 双向认证与 USB 加密锁配置实战 SSL 证书工具 字数统计 BMI 计算 颜色转换 Hash 生成器 JSON 格式化 JWT 解码 房贷计算 时间戳转换 URL 编码 UUID 生成 牛马时钟 二维码批量生成器 CKS Simulator Kubernetes 1.25 FRP TOTP验证码生成器 direct-ssh-passthrough-nat 脚本使用说明 Linux命令行百度网盘 为 Containerd 配置 Harbor 无证书镜像站 Docker一键部署Meta和MetacubexD面板 必应搜索屏蔽垃圾网站 VMware的ubuntu完整安装vm-tools支持粘贴板 Docker Desktop 安装到其他位置 Dell EMC PowerEdge R740服务器内存插槽使用说明及正确安装方法 tc常用命令总结 OpenStack排错 稳定币监管与投资指南 VMware ESXi 密码恢复指南 VMware 加密 state.tgz 文件解密教程 六百万数据 MySQL count(*) 优化 使用iptables禁止特定子网访问指定端口 解决 iptables DNAT 无法转发到 127.0.0.1 的问题及安全风险分析 Linux 一键测试脚本 Gitlab配置详解 Gitlab批量创建用户 Ubuntu安装VNC教程 Windows11跳过微软账号登录 vue配置Nginx伪静态 Linux下Ollama开放端口 模型详解配置 修改Git提交历史中的作者信息 在PowerShell中启动Git Bash的方法 一键安装OpenVPN 大语言模型 模型架构-Transformer模型 训练相关资料 GPT&DeepSeek模型 大模型技术基础 Git Bash 中一键安装 pacman Gitlab-Runner的一些问题 Docker运行kwaivgi-liveportrait Firefox密码提取 在x86-64上构建和运行多种架构的Docker容器 flutter配置镜像站 VMware最新下载地址(纪念碑) 一键安装Conda Docker老版本runc报错无法启动 清理Rancher节点 aapanel 7.x 中文语言配置指南 Ubuntu 22 安装 Kubernetes 1.29 集群指南 Ubuntu修复CNVD-2024-4920726 GRUB锁定密码 Grub2手动引导Linux Cron在线表达式生成器 GitLab一键设置镜像源 文本字符串倒序 Windows禁用任务管理器 UOS(1070a)服务器版本部署Kubernetes1.28 Windows11恢复Windows10右键菜单 Ubuntu一键设置镜像源 CentOS 7 一键设置Vault镜像 Base64在线编码解码 代码差异对比 为Docker分配物理网卡 解密CFSSL生成的CRL数据 已经在谷底了 怎么走都是向上 GitLab统计提交代码行数Python代码 Windows11的24H2出现扩展错误 Windows绕过MicroSoft Store直接下载应用 Fossy平台离线部署分析 在WSL中移除Windows环境变量 重装MicroSoft Store Sony Xperia 10 IV(pdx225)AOSP14编译和刷机方法 pnpm在DevContainer中存储出错解决方法 从SVN迁移仓库到Git Ubuntu中移除Snap软件包 使用Netcat检测UDP端口连通性 rke2集群命令行调试方法 Ubuntu隐私优化-关闭公共门户连接检查 Cisco路由器配置ipv4和ipv6的VTY账户密码 Python实现九九乘法表 Windows10中用多网卡链路聚合来解决网卡网速瓶颈 CentOS7 安装 OpenResty
Python软件授权
Paper-Dragon · 2026-01-05 · via 运维开发绿皮书

Python软件授权

项目地址https://github.com/Paper-Dragon/py-auth

基于 FastAPI 的软件授权服务,支持设备心跳校验、多产品授权策略、易支付对接、Web 管理后台,提供 Python / Go / TypeScript 三端客户端 SDK。

版本更新 (v0.1.6)

发布日期:2026-06-10

新功能

  • 多产品授权体系:支持默认、手动审核、付费三种授权模式,client_secret 按产品/套餐独立配置
  • 易支付集成:公开支付页 /pay、订单管理、异步/同步回调,接入 ezfpy 官方 SDK
  • 套餐信息 API:新增 get_plan_info / get_payment_context,客户端可查询档位、价格、付费状态
  • 设备封禁与手动套餐:管理员可封禁设备或手动指定套餐档位
  • 后台刷新授权start_background_refresh 支持非阻塞软启动模式
  • Go / TypeScript SDK:新增两端客户端,三端 API 对齐
  • WebSocket 实时设备列表:后台设备管理全面迁移为 WebSocket 推送
  • 操作审计日志:管理员操作落库,支持分页查看与按天清理
  • 系统配置页:限流、自动刷新、分页等可在后台配置

改进

  • 心跳统一为单次上报快照,后台线程异步补全设备信息并自动补发心跳
  • 心跳解密增加产品缓存,消除每次请求的全量查询
  • 手动套餐选项改由后端按设备所属产品下发
  • 客户端 HTTP 超时可独立配置(心跳 / 套餐查询 / 付费上下文)
  • Go 客户端 Windows 下隐藏外部命令控制台窗口
  • Docker 镜像 CI 自动构建推送至 Docker Hub

修复

  • 修复缓存的 Product 对象跨 Session 导致的 DetachedInstanceError
  • 修复取消授权或清除手动套餐时 is_authorizedmanual_plan 状态不同步
  • 修复 SQLite 下时区不受 TZ 控制的问题

发布渠道变更

  • Python 客户端已迁移至 PyPI 公开发布,不再使用私有索引
  • 安装方式:pip install py-auth-client

功能概览

  • 设备注册与心跳校验(AES 加密载荷,client_secret 解析产品)
  • 多产品授权策略:默认、手动审核、付费
  • 易支付集成:公开支付页、订单管理、支付回调
  • 管理员登录与用户管理
  • 操作日志审计与接口限流
  • Web 管理后台(设备、产品、订单、易支付、系统配置)
  • 支持 SQLite 和 MySQL

服务端部署

Docker Compose 部署

实际使用中,我直接使用 SQLite 数据库,更简单方便,不需要单独部署 MySQL。

docker-compose.yaml 配置:

version: '3.8'

services:
  auth-service:
    image: jockerdragon/py-auth-service
    build: .
    container_name: auth-service
    environment:
      TZ: Asia/Shanghai
      DATABASE_TYPE: sqlite
      SQLITE_PATH: /app/data/auth.db
      CLIENT_SECRET: aB3cD5eF7gH9iJ1kL3mN5oP7qR9sT1uV3wX5yZ7aB9cD1eF3gH5iJ7kL9mN1oP3qR5sT7uV9wX1yZ3
      SECRET_KEY: M2nP4qR6sT8uV0wX2yZ4aB6cD8eF0gH2iJ4kL6mN8oP0qR2sT4uV6wX8yZ0aB2cD4eF6gH8iJ0
      ACCESS_TOKEN_EXPIRE_MINUTES: 1440
      ADMIN_USERNAME: admin
      ADMIN_PASSWORD: xK9mP2qR5tV8wY
      # 公网访问根地址(生产环境必填,用于易支付回调与对外支付页链接)
      # PUBLIC_BASE_URL: https://auth.example.com
      # 易支付(也可在后台「易支付」页面配置;留空 notify/return 时由 PUBLIC_BASE_URL 自动生成)
      # EPAY_API_URL:
      # EPAY_PID:
      # EPAY_KEY:
      # EPAY_NOTIFY_URL:
      # EPAY_RETURN_URL:
    ports:
      - "8000:8000"
    volumes:
      - auth_data:/app/data
    restart: unless-stopped

volumes:
  auth_data:

启动服务:

git clone https://github.com/Paper-Dragon/py-auth.git
cd py-auth
docker compose up -d

访问地址:

  • Web 管理界面:http://localhost:8000
  • API 文档:http://localhost:8000/docs

查看日志:

docker compose logs -f auth-service

本地运行

python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -e .
Copy-Item env.example .env
cd web && pnpm install && pnpm build && cd ..
python main.py

首次启动会自动创建数据库表并初始化管理员账号。

环境变量

变量说明
DATABASE_TYPE数据库类型,sqlitemysql
SQLITE_PATHSQLite 文件路径
SECRET_KEY服务端 JWT 密钥
CLIENT_SECRET默认产品的 Client Secret(心跳加解密;未登记产品使用)
ACCESS_TOKEN_EXPIRE_MINUTES登录令牌过期时间(分钟)
ADMIN_USERNAME / ADMIN_PASSWORD默认管理员账户
PUBLIC_BASE_URL公网访问根地址,用于易支付回调与对外支付页链接
EPAY_API_URL / EPAY_PID / EPAY_KEY易支付配置(也可在后台页面配置)

示例见项目中的 env.example

注意事项

  • 生产环境请修改 CLIENT_SECRETSECRET_KEYADMIN_PASSWORD 为强密码
  • 数据存储在 Docker volume auth_data 中,删除容器不会丢失数据
  • 生产环境必须配置 PUBLIC_BASE_URL 为 HTTPS 域名,否则支付页链接无法正确生成
  • 如果需要使用 MySQL,可以参考项目中的 env.example 配置

管理后台

页面路径权限
概览/overview登录用户
设备管理/devices登录用户
产品管理/products管理员
订单管理/orders管理员
易支付/epay管理员
系统配置/settings管理员
用户管理/users管理员
审计日志/audit-logs管理员

客户端 SDK 使用

安装

Python

pip install py-auth-client

Go

go get github.com/Paper-Dragon/py-auth/client/go

PyPI 地址https://pypi.org/project/py-auth-client/

AuthClient 参数

参数是否必需说明
server_url必填服务地址
software_name必填软件名称,参与授权规则(默认/手动审核/付费等)
client_secret条件必填可信接入标识,硬编码在发行包中,服务端据此确定套餐 plan;不同套餐/版本使用不同值
device_id可选省略时自动生成或复用
software_version可选软件版本
cache_validity_days可选本地缓存有效期,默认 7
check_interval_days可选检查间隔,默认 2
heartbeat_timeout_sec可选心跳超时,默认 (3.0, 3.0)
plan_info_timeout_sec可选套餐查询超时,默认 (5.0, 10.0)
payment_context_timeout_sec可选付费上下文查询超时,默认 (5.0, 10.0)
debug可选开启调试日志

关于 client_secret

client_secret可信接入标识,发行时硬编码在源码中随安装包分发:

  • 服务端信任该标识,用于识别客户端发行渠道/套餐,并返回对应 plan
  • 免费版 / Pro 版可各自硬编码不同标识
  • software_name 分工:software_name 走授权规则,client_secret 走套餐归属
  • 轮换 client_secret 会使旧发行包标识失效,需发新包

基本使用

参考项目中的 client/python/example.py

from py_auth_client import AuthClient, AuthorizationError

client = AuthClient(
    server_url="http://localhost:8000",
    software_name="我的软件",
    client_secret="sk_...",
)

try:
    client.require_authorization()
    print("设备已授权")
except AuthorizationError as e:
    print(f"授权失败: {e}")
    exit(1)

info = client.get_authorization_info()
print(info)

查询套餐与付费上下文

plan = client.get_plan_info()
if plan.get("success"):
    print(plan.get("plan"), plan.get("price"))
    if plan.get("plan_detail"):
        print(plan.get("plan_detail"))

ctx = client.get_payment_context()
if ctx.get("success"):
    print(ctx.get("plan"), ctx.get("can_pay"))

get_plan_info() 返回产品套餐配置(档位、价格、详情等),不表示本机是否已付款。心跳返回的 authorized 表示能否上线;plan 表示当前生效档位。

后台刷新授权

适用于主线程不阻塞的场景,参考 client/python/example_background.py

from py_auth_client import AuthClient, shutdown_auth_background_executor

client = AuthClient(
    server_url="http://localhost:8000",
    software_name="我的软件",
    client_secret="sk_...",
)

soft, fut = client.start_background_refresh(
    on_done=lambda r: print("后台刷新结果:", r)
)

if soft:
    print("可先依据本地快照启动")
else:
    print("无有效本地快照,需等待本次检查结果")

result = fut.result(timeout=120)
shutdown_auth_background_executor(wait=True)

付费引导

未授权时可引导用户到公开支付页完成付款:

pay_url = f"{client.server_url}/pay?device_id={client.device_id}&auto_pay=1"
print(f"请在浏览器打开以下链接完成付款:{pay_url}")

input("付款完成后按回车继续...")
if client.require_authorization(raise_exception=False, force_online=True):
    print("付款成功,已授权")
else:
    print("仍未授权,请确认订单状态后重试")

三端方法对照

语义PythonGoTypeScript
在线校验授权check_authorizationCheckAuthorizationcheckAuthorization
要求授权通过require_authorizationRequireAuthorizationrequireAuthorization
本地快照可软启动can_soft_launchCanSoftLaunchcanSoftLaunch
后台刷新授权start_background_refreshStartBackgroundRefreshstartBackgroundRefresh
仅读取本地授权信息get_authorization_infoGetAuthorizationInfogetAuthorizationInfo
查询套餐信息get_plan_infoGetPlanInfogetPlanInfo
查询付费上下文get_payment_contextGetPaymentContextgetPaymentContext
清除本地缓存clear_cacheClearCacheclearCache

缓存机制说明

  • 缓存有效期:默认 7 天,由 cache_validity_days 控制
  • 验证流程:优先尝试在线心跳,成功则更新本地缓存
  • 离线支持:在线请求失败时,缓存有效期内降级使用本地快照
  • 缓存位置:系统隐藏目录(Windows: %ProgramData%\.RuntimeRepository),AES-256-GCM 加密
  • get_authorization_info 只读本地、不联网,其中 cache_remaining_time 是本地缓存剩余有效期,不是服务端授权到期时间
  • 如果服务端拒绝授权,即使有缓存也会失败

常见问题

  1. 授权失败:密钥不匹配

    • 检查 client_secret 是否与后台对应产品的密钥一致
    • 注意不同产品/套餐使用不同的 client_secret
  2. 网络连接失败

    • 检查 server_url 是否正确
    • 检查服务端是否正常运行
    • 开启 debug=True 查看详细错误信息
  3. 设备 ID 变化

    • 设备 ID 基于硬件信息自动生成
    • 更换硬件可能导致设备 ID 变化,需要在管理界面重新授权

生产环境检查清单

  • 替换 SECRET_KEYCLIENT_SECRET、默认管理员密码
  • 配置 PUBLIC_BASE_URL 为对外 HTTPS 域名
  • 在后台或 .env 完成易支付商户配置并测试连接
  • 确认后台展示的支付页、回调、跳转地址均为生产域名(非 localhost
  • 使用 HTTPS 反向代理,并正确传递 X-Forwarded-Proto / Host
  • 为各产品配置 client_secret 与授权策略,客户端硬编码对应标识