Kulcsok és biztonság
Kulcscsere leállás nélkül, a kérés-azonosító és a keret-fejlécek olvasása, valamint a követelmények, amelyeket a bírálat minden appon számon kér.
Tudnivaló
A több titkos kulcs kezelése ezen a környezeten még nincs bekapcsolva. Addig a „Hitelesítés” fülön az azonnali csere érhető el: az új kulcs kiadásakor a régi rögtön érvényét veszti.
Egy appnak egyszerre több érvényes client_secret-je lehet (legfeljebb 5), így a kulcscsere leállás nélkül megy:
- A portálon az app „Hitelesítés” fülén kérj „Új titkos kulcs”-ot, és válaszd ki, mikor járjanak le a régiek (alapból 24 óra múlva, legfeljebb 30 nap). Az új kulcs csak egyszer látszik.
- Telepítsd az új kulcsot a szervereden. Az átfedés alatt a régi és az új is érvényes mindenhol, ahol a
client_secret-et küldöd (token-csere,/api/apps/embed/verify). - A régi kulcs a megadott időben magától lejár. Ha minden példányod átállt, előbb is visszavonhatod - a listában látod, melyik kulcsot mikor használták utoljára.
- Kiszivárgás gyanújánál ne várj átfedésre: kérj új kulcsot úgy, hogy a régiek azonnal lejárjanak, vagy vond vissza a kiszivárgott kulcsot.
- Legalább egy lejárat nélküli kulcs mindig marad: az utolsót nem lehet visszavonni, előbb újat kell létrehoznod.
- A csere nem érinti a telepítések
dxk_kulcsait, azembed_secret-et és awebhook_secret-et: a futó telepítéseid a csere alatt is működnek. - Az esemény-titok külön titok (az életciklus-események aláírásához), és egyszerre egy él belőle. A cseréje azonnali: amíg az újat nem telepíted, az ellenőrzésed elutasítja az eseményeket, és az újrapróbálás hozza őket újra.
Ha a fejlesztői fiókot többen használjátok, a kulcsokat csak az a szerep éri el, amelyik appot épít; erről a Csapat és szerepek oldal szól.
A v3 API minden válasza kap egy kérés-azonosítót, a hitelesített válaszok pedig a percenkénti keret állását is hordozzák.
| Fejléc | Mikor jön | Jelentés |
|---|---|---|
X-Request-Id | Minden válaszon, hibánál is. | req_ és 24 karakter. Naplózd: a portál „Napló” fülén erre keresve megtalálod a kérést, és hibabejelentésnél is ezt kérjük. |
X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset | Minden hitelesített válaszon, a 429-en is. | A percenkénti keret, a hátralévő hívások száma, és hány másodperc múlva indul újra a percablak (nem időbélyeg). A számláló szerver-példányonként él, ezért a hátralévő érték tájékoztató. |
X-Dynex-Sandbox | Ha a kulcs teszt-fiókhoz tartozik. | true |
Retry-After | A 429-es válaszon. | Ennyi másodperc múlva próbáld újra. |
A hiba-törzsben is ott az azonosító (error.request_id), a hiányzó hatókör miatti 403-nál pedig az is, melyik hatókör kellett volna (error.required_scope):
403 { "error": { "code": "forbidden", "message": "Token lacks required scope: contacts.write.", "required_scope": "contacts.write", "request_id": "req_…" } }1try {2 await dynex.contacts.create({ email: "anna@example.com" });3} catch (e) {4 if (e instanceof DynexApiError) {5 console.error(e.status, e.code, e.message, "request_id:", e.requestId); // mindig naplózd6 if (e.requiredScope) console.error("hiányzó hatókör:", e.requiredScope);7 if (e.isRateLimited) await sleep((e.retryAfterSec ?? 1) * 1000);8 }9}10dynex.lastRateLimit; // { limit, remaining, resetSec } az utolsó válaszból11dynex.lastRequestId; // az utolsó válasz azonosítója, sikeres hívásnál is- Mit látsz a „Napló” fülön: teszt-fiókos telepítésnél a kéréseket a kérés és a válasz törzsével együtt (a titkok kitakarva), 7 napig. Éles telepítésnél csak a hibás kéréseket, törzs és fiók-azonosító nélkül, 14 napig. A 429-es válaszok nem kerülnek a naplóba.
- Ezeket a fejléceket a
/api/v3végpontjai küldik; a leíró végpontok (/api/v3gyökér,openapi.json,postman.json) és a régi/api/v1nem.
- Minden URL (app_url, redirect_uri, webhook_url) https; fejlesztéshez kizárólag
http://localhostengedett. - A redirect_uri pontosan egyezik a regisztrált listával - nincs minta, nincs prefix, nincs query-eltérés.
- A
client_secret, adxk_kulcs és azembed_secretcsak a szervereden él; soha ne kerüljön böngészőbe, mobil-appba vagy repóba. A Dynex a secretet és a kulcsot hashelve tárolja. Kiszivárgás gyanújánál cseréld le aclient_secret-et a fejlesztői portálon (lásd: Több titkos kulcs). Azembed_secrettelepítésenként más, így egy kiszivárgott érték csak azt az egy telepítést érinti; a helyi ellenőrzés mellé a távoli/api/apps/embed/verifyellenőrzést is érdemes használni. - Az appod bizalmas kliens: a token-csere a szervereden fut a
client_secret-tel. A PKCE S256 kiegészítő védelem, nem helyettesíti. - A
stateparamétert véletlenből képezd, a felhasználó sessionjében (HttpOnly süti) tárold, és a callbackben ezzel vesd össze; hiányzó session-értéknél utasítsd el a callbacket (az SDKreadCallbackParams-a üres elvárt state-nélnull-t ad). A függő state-eket 10 perc után takarítsd. - A beágyazási tokent minden betöltéskor ellenőrizd (aláírás + lejárat), ne naplózd, és váltsd saját sessionre; a híd üzeneteit csak a Dynex originről és csak a szülő ablaktól fogadd el; a beágyazott oldal küldjön
frame-ancestorsCSP-t. - A kontextus mezői (
tenantName,userEmail, …) és a callback paraméterei idegen bevitel: HTML-be csak escape-elve. - Fejlesztői/diagnosztikai végpontot, ami bérlői adatot ad vissza, ne hagyj nyitva (tunnel mögött sem).
- Webhookot csak érvényes aláírással dolgozz fel; a bérlőt az aláírt törzs
tenantId-jából vedd, ne a URL-ből. - Két webhook-csatorna, két titok:
app.*eseményt csak az app esemény-titkával ellenőrizve (parseAppEvent) fogadj el, a telepítéswebhook_secret-jével soha. AzX-Dynex-Channelfejléc nincs aláírva, önmagában semmit nem bizonyít. - A kulcs a telepítés hatóköreire korlátozott; ami nem kell, ne kérd. Egy 403
forbiddenválasz hiányzó hatókört jelent - hogy melyiket, azt azerror.required_scopemező mondja meg. - Tenant-izoláció nálad is: minden tárolt adatot az
install_id/tenant_idalá köss, és eltávolításkor (app.uninstalledesemény; a kulcs ekkor már 401-et ad) töröld a bérlő adatait. - Kvóta: a kulcsra a v3 API percenkénti és napi keretei érvényesek. A percenkénti keret állását az
X-RateLimit-*fejlécek mutatják (tájékoztató érték), a túllépést a429státusz jelzi, a várakozás hosszát aRetry-Afterfejléc.