Authentication
API listen di 0.0.0.0:8090, jadi siapa aja di network yang sama
bisa nyampe. File PIN di %APPDATA%\Seraph\pin.txt ngegate aksesnya.
PIN sendiri diprint pas startup (PIN=<6 digit> at <path>) dan
rotate per process.
Flow
# 1. Tukar PIN dengan token long-lived.
curl -s -X POST http://localhost:8090/auth/pin \
-H 'content-type: application/json' \
-d '{"pin":"798465"}'
{ "token": "DLqXoY3WJmWqf3rL...0+9pjSjuBKP" }
# 2. Pasang token di setiap call selanjutnya.
curl -s http://localhost:8090/api/bots \
-H 'authorization: Bearer DLqXoY3WJmWqf3rL...0+9pjSjuBKP'
Token juga bisa dikirim sebagai ?token=<token> di query string —
berguna buat <img> / EventSource yang gak bisa set header.
Endpoints
GET /health
Tanpa auth. Dipake monitor / load balancer external buat cek apakah process-nya hidup.
Response (200, text/plain):
ok
POST /auth/pin
Tukar PIN lokal dengan bearer token long-lived.
Body:
{ "pin": "798465" }
Response (200):
{ "token": "<base64-48-byte-token>" }
Errors:
| Status | Body |
|---|---|
401 | {"error":"wrong pin"} |
429 | {"error":"locked, retry in 38s"} |
GET /api-info
Helper bearer-protected yang dipake webview embedded buat discover port + token-nya sendiri. Berguna sebagai ping "token-ku masih hidup gak setelah restart?" dari tooling external.
Response (200):
{
"port": 8090,
"token": "<token-yang-sama-yang-baru-dikirim>"
}
Rate limiting
Satu token-bucket di /auth/pin ngelambatin attempt brute-force.
Setelah salah PIN beberapa kali, bucket-nya kunci dan return:
429 Too Many Requests
{"error":"locked, retry in 38s"}
Bucket per-process; restart Seraph reset semuanya. PIN-nya 6 digit = 1.000.000 candidate, tapi bucket cap di ~12 percobaan/menit, jadi brute-force beneran butuh >50 hari rata-rata.