Skip to content

HTTP-API ​

Skripte und Websites (Dashboards, Discord-Bots, Shops) können den Server über eine JSON-API lesen und ändern, die FXServer auf dem Spielport bereitstellt:

text
http://<server ip>:<port>/<resource>/v1/<route>

Aktivieren ​

Die API ist standardmäßig aus. Aktiviere sie in /nay auf der Seite Nayretis: HTTP-API (ApiEnabled). Solange sie aus ist, antwortet jede Route mit 503 api_disabled. Maximale Anfragegröße (KB) (ApiMaxBodyKb) begrenzt den Anfrageinhalt (standardmäßig 1024 KB).

Tokens ​

Erstelle Tokens im Tab API von /nay (das Token wird nur einmal angezeigt: kopiere es sofort) oder über die Serverkonsole:

text
nay_api_token create <label> <scope...>
nay_api_token list
nay_api_token revoke <id>

Ein Token sieht so aus: nay_<id>_<secret>. Gespeichert wird nur sein SHA-256-Hash. Jedes Token hat seine Scopes, optional erlaubte Adressen (IPv4, IPv6 oder CIDR-Bereiche), ein Anfragelimit pro Minute und ein optionales Ablaufdatum.

Scopes haben die Form <resource>.<scope>, mit Platzhaltern: nay_car_wash.* gibt jede Route eines Skripts frei, * gibt alles frei. Jedes Skript listet seine Routen und Scopes auf seiner eigenen Seite, zum Beispiel Car Wash.

Anfragen ​

  • Sende Authorization: Bearer <token>.
  • Anfrageinhalte sind JSON (Content-Type: application/json) mit einem Content-Length. Inhalte in Chunks werden abgelehnt.
  • Nach 10 fehlgeschlagenen Authentifizierungen innerhalb einer Minute werden Anfragen ohne gültiges Token von dieser Adresse 5 Minuten lang abgelehnt. Gültige Tokens funktionieren weiter.
  • Hinter einem Reverse Proxy setzt du nay:apiTrustedProxies (siehe HTTPS). Sonst teilen sich alle Aufrufer die Adresse des Proxys.

Jede Antwort ist JSON mit einem Header X-Request-Id:

json
{ "ok": true, "data": { } }
{ "ok": false, "error": { "code": "forbidden", "message": "This token does not allow this route", "details": { } } }
StatusCodeBedeutung
400unexpected_body, invalid_json, invalid_requestInhalt an eine Route ohne Inhalt gesendet, Inhalt kein gültiges JSON oder fehlerhafter Content-Length.
401unauthorizedToken fehlt, ist unbekannt, widerrufen oder abgelaufen.
403forbidden, ip_not_allowedDem Token fehlt der Scope, oder die Adresse ist für dieses Token nicht erlaubt.
404 / 405not_found, method_not_allowedUnbekannte Route oder falsche Methode für eine bekannte Route.
411length_requiredJedes Transfer-Encoding (Inhalt in Chunks).
413payload_too_largeInhalt größer als ApiMaxBodyKb. Ein angekündigter Content-Length über 10 MB wird abgelehnt, bevor der Inhalt gelesen wird.
415unsupported_media_typeInhalt, der nicht application/json ist.
422invalid_request, unknown_parameter, invalid_valueParameter, Query oder Inhalt besteht die Prüfung nicht (details.path und details.reason).
429rate_limited, too_many_failuresToken über seinem Limit pro Minute oder Adresse gesperrt. Siehe Retry-After.
500internal_errorDie Route ist fehlgeschlagen. Siehe Serverkonsole.
503api_disabled, not_readyAPI aus oder Ressource startet noch (Retry-After).
504timeoutDie Route hat nicht innerhalb von 10 Sekunden geantwortet. Sie läuft weiter: Eine Änderung kann nach dem 504 noch angewendet werden, lies den Zustand also erneut, bevor du es noch einmal versuchst.

Routen von nay_lib ​

MethodeRouteScopeDaten
GET/nay_lib/v1/statusnay.statusServername, Spieler, maximale Spieler, Framework, Inventar, Target, Nayretis Ressourcen und Versionen.
GET/nay_lib/v1/playersnay.playersVerbundene Spieler: ID, Name, Charakter, Kennung, Job.
GET/nay_lib/v1/settings/:resourcenay.settings plus <resource>.config oder nay.configEinstellungen eines Skripts mit ihren Werten.
PUT/nay_lib/v1/settings/:resource/:keywie obenÄndert eine Einstellung. Inhalt { "value": ... }.
DELETE/nay_lib/v1/settings/:resource/:keywie obenSetzt eine Einstellung auf ihren Standardwert zurück.
GET/nay_lib/v1/auditnay.auditProtokoll, 50 Einträge pro Seite. Query resource, action, actor, from und to (Unix-Sekunden), page.

Jeder Aufruf, der etwas ändert, wird ins Protokoll geschrieben (api.call, Urheber api:<token label>).

HTTPS ​

FXServer spricht nur unverschlüsseltes HTTP: Jeder auf dem Übertragungsweg kann ein so gesendetes Token mitlesen. Setze einen Reverse Proxy mit Zertifikat vor die API und gib nur die Routen frei, die du nutzt. Teile nay_lib dann mit, welchen Proxys es vertrauen soll, damit erlaubte Adressen und Anfragelimits für die echte Client-Adresse aus X-Forwarded-For gelten:

cfg
set nay:apiTrustedProxies "127.0.0.1"

Der Wert ist eine durch Kommas getrennte Liste von Adressen oder CIDR-Bereichen.

nginx:

nginx
server {
	listen 443 ssl;
	server_name api.example.com;
	ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;

	location ~ ^/(nay_lib|nay_car_wash)/v1/ {
		proxy_pass http://127.0.0.1:30120;
		proxy_set_header X-Forwarded-For $remote_addr;
		client_max_body_size 1m;
	}
}

Caddy (Zertifikat wird automatisch bezogen):

caddy
api.example.com {
	@nayretis path_regexp ^/(nay_lib|nay_car_wash)/v1/
	reverse_proxy @nayretis 127.0.0.1:30120
}