2.9 KiB
2.9 KiB
FiveM-Bridge — Setup
Die Bridge (fivem-bridge/) verbindet das Ingame-Tablet mit dem MDT-Backend/Web.
Sie ist bewusst minimal: Token holen · Web-App im NUI-iframe öffnen · Dienst/Positionen
pushen · Waypoint setzen. Die eigentliche MDT-Logik lebt im Backend/Web.
Architektur
Cop drückt Taste
→ Client holt Token vom Bridge-Server (lib.callback)
→ Bridge-Server ruft Backend POST /auth/fivem (Header x-bridge-secret)
← { token, user }
→ Client öffnet NUI-Shell (nui/index.html) mit <iframe src=WebUrl>
→ Shell postMessaged { action:'auth', token, user } ins iframe
→ Web-App ist eingeloggt
Server-Thread (nur im Dienst): GetEntityCoords → POST /bridge/officer/position
Dienstwechsel: POST /bridge/officer/duty
Andere Resource: exports.d4rk_tablet:createDispatch(...) → POST /bridge/dispatch
Voraussetzungen
qbx_core,ox_lib- MDT-Backend erreichbar (Node, siehe dev-setup.md)
- MDT-Web-App gehostet und erreichbar (der Build mit korrekten
VITE_API_URL/VITE_SOCKET_URL, undVITE_DEV_AUTH_BYPASS=false!)
server.cfg
# MDT-Bridge
set mdt:backendUrl "https://mdt-api.deinserver.de" # Backend-Basis-URL (server→server)
set mdt:webUrl "https://mdt.deinserver.de" # gehostete Web-App (im iframe)
set mdt:bridgeSecret "<langes-zufalls-geheimnis>" # == BRIDGE_HMAC_SECRET im Backend!
set mdt:openCommand "mdt"
ensure d4rk_tablet # bzw. der Ordnername der Bridge-Resource
Wichtig:
mdt:bridgeSecretmussBRIDGE_HMAC_SECRETin der Backend-.enventsprechen.- Backend-
CORS_ORIGINSmuss diemdt:webUrl-Origin enthalten (das iframe fetcht cross-origin).
Nutzung
- Taste/Command (
mdt) öffnet das Tablet. Nur Jobs ausConfig.JobDepartmentsbekommen Zugriff. ESCschließt es (oder Logout in der Web-App →mdt:close).- Dienst:
/mdtdutytoggelt (oder QBox-SetDuty-Event). Nur im Dienst wird die Position gepusht → erscheint auf der Leitstellen-Karte. - Dispatch aus anderer Resource:
exports.d4rk_tablet:createDispatch({ code = '10-90', title = 'Banküberfall', department = 'police', priority = 'high', location = 'Pacific Standard', coords = { x = 235.0, y = 216.0, z = 106.0 }, })
Sicherheit
- Bridge↔Backend: Shared-Secret-Header
x-bridge-secret(server-zu-server). Alternativ HMAC (x-mdt-timestamp+x-mdt-signature) — das Backend akzeptiert beides. - Positionen werden server-seitig via
GetEntityCoordsermittelt (kein Vertrauen in Client-Coords). - Der JWT-Token wird nur per
postMessagean das iframe übergeben (nicht in der URL).
Verifiziert
Backend-Contract per curl getestet: /auth/fivem (Secret → Token+User), /bridge/officer/duty|position,
/bridge/dispatch (Secret → 200, falsches/kein Secret → 401). Der Lua-Teil braucht einen laufenden
FiveM-Server zum Live-Test.