Revoke licenses by product key instead of shared sub.

Add revokedKeys storage and accept key in admin revoke API so DND/TTRPG keys with the same sub can be revoked independently.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-07-01 16:44:16 +08:00
parent b7c14d6191
commit e299cfc7dd
5 changed files with 85 additions and 9 deletions
+1 -1
View File
@@ -62,7 +62,7 @@ npm test
- `POST /v1/activate``{ "productKey": "...", "deviceId": "..." }``{ token, sub }`.
- `GET /v1/status?sub=...``{ revoked: boolean }`.
- `POST /v1/admin/revoke``Authorization: Bearer <LICENSE_ADMIN_TOKEN>`, тело `{ "sub": "..." }`.
- `POST /v1/admin/revoke``Authorization: Bearer <LICENSE_ADMIN_TOKEN>`, тело `{ "key": "TTRPG-..." }` (один продуктовый ключ) или `{ "sub": "..." }` (все ключи с этим sub, legacy).
- `POST /v1/admin/issue` — админская выдача (`sub`, `pid`, `iat`, `exp`, `did`).
- `GET /v1/admin/licenses` — список продуктовых ключей с активациями и флагом `revoked`.
- `POST /v1/admin/product-keys` — создание нового продуктового ключа (`pid`, `maxDevices`, `expiresAtSec`, опционально `key`, `sub`).