RE:NODE

Role, oprávnění a API tokeny ve Strapi: jak ho zabezpečit

Text: Tým RE:NODE
20 min čtení


Čerstvá instalace Strapi je ve výchozím stavu zavřená, a to je dobrá zpráva: role Public na začátku nemá povolené nic, takže nový typ obsahu odpovídá anonymním požadavkům 403 Forbidden, dokud nerozhodneš jinak. Riziko nejsou výchozí hodnoty. Je to to, co lidé dělají, aby frontend v pátek odpoledne zprovoznili: zaškrtnou všechna políčka u Public, vytvoří API token Full access a vloží ho do bundlu v prohlížeči, nechají otevřené registrace a každému editorovi dají roli Super Admin. Tento návod prochází čtyři oddělené systémy oprávnění, které Strapi má, co který z nich řídí a v jakém pořadí novou instalaci zabezpečit. U každého kroku je test pomocí curl, abys věděl, že změna udělala to, co si myslíš.

Návod se týká Strapi 5, aktuální hlavní verze. Názvy v menu se mezi vydáními 5.x mírně liší, takže tam, kde na popisku záleží, je uveden tak, jak ho uvidíš v Settings; obecné uspořádání platí i pro Strapi 4.

Čtyři různé druhy „uživatele“ ve Strapi#

Strapi má čtyři identity, kterým se všem říká „uživatel“, a většina chyb vzniká jejich zaměňováním. Každá je uložená v jiné tabulce, spravuje se na jiné obrazovce a dosáhne na jinou část aplikace.

IdentitaKde se spravujeNa co dosáhne
Admin uživatelSettings, Administration Panel, UsersAdministrace na adrese /admin
Koncový uživatelContent Manager, User (Users and Permissions)Content API přes JWT
API tokenSettings, Global settings, API TokensContent API přes bearer token
Anonymní návštěvníkNení co spravovatContent API jako role Public

Admin uživatelé jsou tvoji editoři a vývojáři. Do administrace se přihlašují e-mailem a heslem a co tam smějí, určuje admin role. Přes toto přihlášení se k content API nedostanou: administrace komunikuje s vlastními interními cestami pod /admin.

Koncoví uživatelé patří pluginu Users and Permissions: jsou to lidé, kteří se registrují na tvém webu, pokud jim to dovolíš. Jsou to běžné záznamy typu User, přihlašují se na /api/auth/local a dostávají JWT. Jejich oprávnění vychází z role Users and Permissions, buď Authenticated, nebo té, kterou vytvoříš.

API tokeny jsou pro software, ne pro lidi: generátor statického webu při sestavení, backend mobilní aplikace, skript. Token nese vlastní seznam oprávnění a posílá se v hlavičce Authorization.

Anonymní návštěvník nemá žádné přihlašovací údaje. Cokoli mu dovolíš, je dovoleno celému internetu, včetně vyhledávacích robotů a scraperů. Strapi takový požadavek zařadí pod roli Public.

role Publicrole Authenticatedpráva tokenuadmin roleAnonymní návštěvníkbez přihlášeníKoncový uživatelJWT z /api/auth/localSoftwareAPI tokenEditorContent API/api/...Administrace/admin
Tři cesty do content API a administrace vedle nich

Když si tenhle obrázek udržíš v hlavě, vyřeší se většina otázek typu „proč mi nejde...“. API token neotevře administraci. Heslo admina na /api nefunguje. Oprávnění pro Public je oprávnění pro všechny, včetně držitelů ostatních tří druhů přihlašovacích údajů, protože mohou údaje jednoduše vynechat a budou zpracováni jako role Public.

Role Public: začni od nuly#

Otevři Settings a v části Users and Permissions plugin vyber Roles. Vestavěné role jsou dvě: Public a Authenticated. U každého typu obsahu editor role vypisuje dostupné akce: find (seznam), findOne (jeden záznam), create, update a delete. Single types mají vlastní sadu akcí. Nový typ obsahu začíná pro Public s nic nezaškrtnutým.

Pravidlo se snadno řekne a překvapivě málo dodržuje: povol co nejméně akcí na co nejméně typech obsahu a nikdy nic, co zapisuje.

  • U blogu nebo prezentačního webu obvykle stačí find a findOne pro typy obsahu, které veřejné stránky skutečně vykreslují.
  • Nepovoluj create, update ani delete pro Public. Pokud kontaktní formulář potřebuje vytvářet záznamy, dej před něj malou serverovou cestu nebo serverless funkci, nebo počítej s tím, že do jednoho konkrétního typu obsahu může psát kdokoli, a to, co se tam objeví, ber jako nepřátelský vstup.
  • Podívej se, co dalšího je v seznamu. Sekce Users and Permissions obsahuje user.find, user.findOne, user.count a další. Zaškrtnutí user.find pro Public zveřejní na internetu seznam tvých registrovaných uživatelů včetně jejich e-mailových adres.
  • Sekce Upload obsahuje mimo jiné upload.find, upload.findOne a upload.destroy. Soubory, na které tvůj obsah odkazuje, se servírují jako běžné statické soubory ze své adresy URL a tato oprávnění nepotřebují; veřejné destroy by byla katastrofa.

Public má také ve výchozím stavu zapnutou sadu akcí auth (přihlášení, registrace, obnovení hesla), protože bez nich by přihlašovací cesty nefungovaly. Právě proto je důležitá další část.

Otestuj, co máš. Z počítače bez tokenu, s tvým hostem místo cms.example.com:

bash
$ curl -i https://cms.example.com/api/articles$ curl -i https://cms.example.com/api/pages$ curl -i https://cms.example.com/api/users

Typ obsahu, který jsi neotevřel, odpoví HTTP/1.1 403 Forbidden a tělem JSON, kde error.name je ForbiddenError. Otevřený typ odpoví 200 a polem data. Pokud místo 403 přijde 404, cesta neexistuje: množné jméno typu obsahu je jiné, než jsi napsal. Množné jméno je v Content-Type Builderu uvedeno jako API ID (plural) a je to segment cesty za /api/.

Co Public vidí kromě samotného záznamu

O tom, kolik grafu vazeb se vrátí spolu se záznamem, rozhodují dva parametry dotazu. Strapi 5 ve výchozím stavu vrací jen vlastní pole záznamu; relace, média a komponenty se objeví, když o ně požadavek požádá přes populate. Požadavek s ?populate=* žádá o jednu úroveň všeho. Použitá role musí mít také právo číst související typ obsahu, takže otevření article automaticky neotevře author, ale otevřením obou snadno odhalíš víc, než jsi chtěl.

Druhým parametrem je stránkování. Když to necháš být, klient si může vyžádat libovolnou velikost stránky. Omez ji v config/api.js:

config/api.js
module.exports = {  rest: {    defaultLimit: 25,    maxLimit: 100,    withCount: true,  },};

defaultLimit platí, když požadavek velikost neuvede, a maxLimit je strop, který požadavek nepřekročí. Malý maxLimit trpělivého scrapera nezastaví, ale odstraní stažení celé tabulky jedním požadavkem. Pokud používáš plugin GraphQL, má obdobná nastavení (defaultLimit, maxLimit, depthLimit, amountLimit) v config/plugins.js a sandbox Apollo řídí playgroundAlways; v produkci ho nech vypnutý.

Role Authenticated a registrace#

Roli Authenticated dostane přihlášený koncový uživatel. Také začíná téměř prázdná. U většiny webů nejde o to, co smí Authenticated, ale o to, jestli se jím vůbec někdo má moct stát.

Pokud tvůj web nemá členskou sekci, odpověď zní ne a stačí k tomu jeden přepínač. V Users and Permissions plugin otevři Advanced settings a vypni Enable sign-ups. Když je vypnuto, POST /api/auth/local/register přestane vytvářet účty. Když už tam jsi, projdi i ostatní nastavení na téže stránce:

NastaveníCo udělat
Default role for authenticated usersNech Authenticated, nikdy roli se zápisem
Enable sign-upsVypnuto, pokud se lidé opravdu neregistrují
One account per email addressZapnuto
Enable email confirmationZapni, pokud registrace zůstává otevřená a e-mail funguje
Reset password pageNastav adresu obnovy hesla na svém frontendu, ne výchozí

Potvrzení e-mailu vyžaduje funkčního poskytovatele pošty, takže ho nezapínej, dokud neodešleš zkušební zprávu, jinak se noví uživatelé zamknou mimo vlastní účty. Výchozí poskytovatel Strapi, sendmail, počítá s tím, že na stroji je agent pro přenos pošty, což malý kontejner obvykle nemá.

Pokud necháš registraci otevřenou, je registrační cesta veřejným zápisovým koncovým bodem, za nímž stojí automatické vytvoření účtu. Ber ji jako každý přihlašovací formulář: dej před ni omezení četnosti. Správným místem je reverzní proxy, o čemž je řeč v části o zabezpečení hrany níže.

JWT, které Users and Permissions vydává, má životnost a podpisové tajemství. Tajemství je jwtSecret, ve vygenerovaném projektu se čte z JWT_SECRET. Životnost je jwt.expiresIn v config/plugins.js a výchozí hodnota je dlouhá (v době psaní 30 dní). Pro cokoli většího než hobby web ji zkrať:

config/plugins.js
module.exports = ({ env }) => ({  'users-permissions': {    config: {      jwtSecret: env('JWT_SECRET'),      jwt: {        expiresIn: '7d',      },    },  },});

JWT se na serveru neukládají, takže neexistuje seznam aktivních relací, které by šlo zrušit. Zmírněním je zkrácení expiresIn a změna JWT_SECRET je nouzová brzda, která zneplatní všechny najednou za cenu odhlášení všech koncových uživatelů. Návod na Strapi v produkci vypisuje další tajné klíče a co se rozbije při změně každého z nich.

API tokeny: omezené, s platností, jeden na každého konzumenta#

API token je správný přihlašovací údaj pro software. V Settings, Global settings, API Tokens zvol Create new API Token. Vyplňuješ čtyři věci.

  • Název a popis: použij jméno konzumenta, například marketing-site-build. Až token unikne, podle názvu poznáš, který systém opravit.
  • Token duration: 7 days, 30 days, 90 days nebo Unlimited. Vyber nejkratší dobu, kterou jsi ochotný obnovovat. Unlimited má být vědomá volba, ne cesta, jak rychle zavřít dialog.
  • Token type: Read-only, Full access nebo Custom.

Tři typy se výrazně liší dosahem případné škody:

TypCo povolujeNa co
Read-onlyfind a findOne na všech typech obsahuStažení všeho při sestavení
Full accessKaždou akci na každém typu obsahuSkoro na nic
CustomJen akce, které zaškrtneš, po typech obsahuVýchozí volba

Full access se vyhýbej. Token, který umí delete na každý záznam, ve skriptu sestavení, který navíc běží na CI serveru čitelném pro další lidi, je velmi drahá věc na ztrátu. Read-only je bezpečný vůči zápisu, ale stále pokrývá všechny typy obsahu, i ty, které konzument nepotřebuje. Custom ti dovolí zaškrtnout přesně find a findOne na dvou typech obsahu, které frontend vykresluje, a nic jiného, a měl by být tvým výchozím bodem.

Po uložení se hodnota tokenu zobrazí. Strapi ukládá hash tokenu odvozený se solí API_TOKEN_SALT, takže ve výchozím nastavení můžeš hodnotu zkopírovat jen v tu chvíli. Novější vydání 5.x umějí token zobrazit znovu, pokud je nastaven šifrovací klíč (ENCRYPTION_KEY, který config/admin.js ve vygenerovaném projektu čte jako secrets.encryptionKey); pokud ho máš v .env, drž ho beze změny stejně jako ostatní tajné klíče. V každém případě hodnotu rovnou ulož do úložiště tajných klíčů systému, který ji bude používat.

Použij ho jako bearer token:

bash
$ curl -i https://cms.example.com/api/articles \    -H "Authorization: Bearer $STRAPI_TOKEN"

Testuj hranici stejně jako úspěch. S tokenem typu Custom, který má jen find na articles:

bash
$ curl -i https://cms.example.com/api/pages -H "Authorization: Bearer $STRAPI_TOKEN"$ curl -i -X DELETE https://cms.example.com/api/articles/abc123 \    -H "Authorization: Bearer $STRAPI_TOKEN"

Oba musí odpovědět 403. Špatný nebo prošlý token odpoví 401 Unauthorized; platný token, který tu akci nesmí, odpoví 403. Umět tyto dva kódy rozlišit ušetří spoustu ladění: 401 je o tom, kdo jsi, 403 o tom, co smíš.

Několik zvyků udrží tokeny pod kontrolou:

  1. Jeden token na konzumenta. Pokud testovací a produkční web sdílejí token, nemůžeš zrušit jeden, aniž bys rozbil druhý.
  2. Nikdy neposílej token do prohlížeče. Cokoli v klientském bundlu je veřejné. Token v NEXT_PUBLIC_ nebo obdobné proměnné je oprávnění Public s dalšími kroky navíc. Pokud prohlížeč potřebuje data, zveřejni je přes roli Public (jen čtení, pár typů obsahu) a token si nech pro serverový kód.
  3. Při podezření vygeneruj nový. Na stránce úpravy tokenu je tlačítko Regenerate, které vydá novou hodnotu a starou zneplatní. Oprávnění zůstanou.
  4. Obnovuj podle kalendáře. U 90denních tokenů je záznam v kalendáři dva týdny před vypršením levnější než výpadek.
  5. Tokeny drž v prostředí hostitele, ne v repozitáři. Proč, vysvětluje text proměnné prostředí a tajné klíče.

API tokeny platí jen pro content API. Nemohou se přihlásit do administrace a nemohou měnit typy obsahu, role ani nastavení.

Transfer tokeny jsou něco jiného

Ve stejných Global settings najdeš také Transfer Tokens. Opravňují k strapi transfer, živému kopírování dat mezi dvěma instancemi Strapi, a mají směr Push nebo Pull. Jejich sůl je TRANSFER_TOKEN_SALT. Transfer token se směrem Pull může přečíst celý tvůj obsah i média. Vytvoř ho jen na ten okamžik, kdy ho potřebuješ, dej mu nejkratší platnost a potom ho smaž.

Admin uživatelé a admin role#

Admin uživatelé jsou lidé, kteří se přihlašují na /admin. V Settings, Administration Panel, Roles jsou na čerstvé instalaci tři role:

RoleCo smí
Super AdminVšechno, včetně nastavení, rolí, tokenů a pluginů
EditorVytvářet, číst, upravovat, mazat a publikovat veškerý obsah
AuthorVytvářet, číst, upravovat a mazat jen vlastní obsah

První člověk, který na čerstvé instalaci otevře /admin, vytvoří Super Admina. Udělej to sám hned, dřív než na server nasměruješ veřejnou doménu. Potom platí pravidlo, že Super Adminem by téměř nikdo neměl být. Je to jediná role, která může vytvářet API tokeny, měnit roli Public, instalovat pluginy a zvát další adminy, a nelze ji upravit ani omezit.

Lidi zvi v Settings, Administration Panel, Users, tlačítkem Invite new user. Pokud má server poskytovatele pošty, dostanou odkaz. Pokud ne, Strapi ti zobrazí registrační odkaz, který zkopíruješ a pošleš ručně; po použití přestane platit a nevkládej ho do veřejného kanálu. Nový admin si na tomto odkazu zvolí vlastní heslo.

Vestavěným rolím chybí jemnější členění. Zduplikuj Editor nebo Author a uprav kopii. Každá role je mřížka typů obsahu proti akcím (Create, Read, Update, Delete, Publish), k tomu pole uvnitř každého typu a sekce Plugins a Settings. Prakticky použitelné to dělají dvě funkce:

  • Oprávnění na úrovni polí. U typu obsahu rozbal pole a odškrtni ta, která role nesmí vidět ani měnit. Dobrým příkladem je pole s cenou, které upravují jen manažeři.
  • Podmínky. Oprávnění lze omezit podmínkou, například „Is creator“, takže Author může upravovat záznamy, které vytvořil, a žádné cizí. Bez podmínky platí oprávnění pro každý záznam.

Oprávnění v Settings si zaslouží pozornost zvlášť. Roli lze dovolit číst nebo vytvářet API tokeny, nebo číst role, aniž by směla sahat na cokoli dalšího. Dej je jen těm, kdo web provozují.

Co udělat na každé instalaci:

  1. Vytvoř si pojmenovaného Super Admina a druhého, schovaného pro nouzi, místo sdíleného jednoho přihlášení.
  2. Používej skutečnou e-mailovou adresu každého člověka. Sdílená schránka admin@ dělá stopu aktivit k ničemu a každé obnovení hesla vyjednáváním.
  3. Když někdo odejde, deaktivuj jeho účet (seznam Users má přepínač aktivity), místo aby ses spoléhal na vypršení.
  4. Používej dlouhá unikátní hesla ze správce hesel. Komunitní edice Strapi nemá vestavěné dvoufázové přihlášení do administrace; jednotné přihlášení (SSO) je součástí placených edic. Pokud na tom záleží, zkontroluj dokumentaci Strapi pro svou verzi.

Pokud se zamkneš, nemusíš sahat do databáze. Z adresáře projektu umí CLI vytvořit nového Super Admina nebo obnovit heslo:

bash
$ npm run strapi admin:create-user -- --firstname=Ada --lastname=Admin \    --email=ada@example.com --password='a-long-unique-password'$ npm run strapi admin:reset-user-password -- --email=ada@example.com --password='another-one'

Kdo může spustit tyto příkazy, už má adresář projektu, takže příkazy nepřidávají žádné nové riziko. Je to ale další důvod, proč od začátku omezit, kdo se dostane k souborům a konzoli serveru.

Oprávnění z kódu místo klikání#

Role a oprávnění jsou data. Žijí v databázi, ne v projektu, což má následek, který lidi překvapuje: nasazení z Gitu na druhé prostředí je s sebou nenese. Tvůj testovací web může být dokořán otevřený nebo produkce pevně zavřená, zatímco kód, který oprávnění potřebuje, už běží. Po každé migraci to ověř a zvaž, že oprávnění Public zapíšeš do kódu, aby znovu vytvořené prostředí začínalo ve známém stavu.

Vzor, který používají ukázkové projekty Strapi, je funkce bootstrap v src/index.js, která najde roli a vytvoří potřebné záznamy oprávnění. Akce se jmenují api::<singular>.<singular>.<action>:

src/index.js
module.exports = {  register() {},  async bootstrap({ strapi }) {    const publicRole = await strapi.db      .query('plugin::users-permissions.role')      .findOne({ where: { type: 'public' } });    const actions = ['api::article.article.find', 'api::article.article.findOne'];    for (const action of actions) {      const existing = await strapi.db        .query('plugin::users-permissions.permission')        .findOne({ where: { action, role: publicRole.id } });      if (!existing) {        await strapi.db          .query('plugin::users-permissions.permission')          .create({ data: { action, role: publicRole.id } });      }    }  },};

Tento kód oprávnění jen přidává a nikdy neodebere to, co někdo zaškrtl ručně, takže je to spodní hranice, ne zámek. I tak díky němu nové prostředí obslouží veřejné stránky bez ručního proklikávání a seznam veřejného leží ve verzovacím systému, kde ho vidí recenzent. Změň article na jednotné číslo názvu svého typu obsahu.

Zabezpečení hrany: proxy, CORS a omezení četnosti#

Oprávnění určují, co smí přihlášený nebo anonymní požadavek. Okolní vrstvy rozhodují, kdo se smí vůbec ptát.

CORS se nastavuje middlewarem strapi::cors v config/middlewares.js. Ve výchozím stavu povoluje libovolný origin. CORS je pravidlo prohlížeče a curl nezastaví, ale přísný seznam brání cizím webům volat tvé API prostřednictvím prohlížečů jejich návštěvníků:

config/middlewares.js
module.exports = [  'strapi::logger',  'strapi::errors',  'strapi::security',  {    name: 'strapi::cors',    config: {      origin: ['https://www.example.com'],      methods: ['GET', 'HEAD', 'OPTIONS'],      headers: ['Content-Type', 'Authorization'],      keepHeaderOnError: true,    },  },  'strapi::poweredBy',  'strapi::query',  'strapi::body',  'strapi::session',  'strapi::favicon',  'strapi::public',];

Pořadí middlewarů nech tak, jak ho má vygenerovaný soubor, a změň jen položku strapi::cors. Administrace se servíruje ze stejného originu jako API, takže seznam originů pro frontend se jí netýká.

Omezení četnosti patří na reverzní proxy u cest, kde se hádá: přihlášení do administrace na /admin/login a přihlášení a registrace koncových uživatelů pod /api/auth/local. Samotné Strapi má pro přihlášení do administrace vlastní nastavení omezení (blok admin.rateLimit v config/admin.js) a vyplatí se ho zapnout, ale limit na proxy funguje stejně v jakékoli verzi Strapi a chrání i proces před zátěží. V nginxu:

nginx
limit_req_zone $binary_remote_addr zone=strapi_auth:10m rate=10r/m;server {    # ... TLS and the usual proxy_pass block ...    location = /admin/login {        limit_req zone=strapi_auth burst=5 nodelay;        proxy_pass http://127.0.0.1:1337;    }    location /api/auth/ {        limit_req zone=strapi_auth burst=5 nodelay;        proxy_pass http://127.0.0.1:1337;    }}

Nadbytečné požadavky dostanou ve výchozím stavu 503; přidej limit_req_status 429;, pokud dáváš přednost přesnějšímu kódu. Zbytek nastavení proxy je v návodu na reverzní proxy v nginxu a text pravidla firewallu, na kterých záleží popisuje, jak držet port Node mimo veřejný internet, pokud proxy běží na stejném stroji.

Stojí za to znát ještě jednu strukturální možnost: administrace a API nemusí být veřejné společně. Pokud editoři pracují ze známých sítí, můžeš /admin na proxy omezit podle adresy a /api nechat otevřené pro frontend. Je to další vrstva, ne náhrada rolí.

Strapi na RE:NODE#

Na RE:NODE je Strapi aplikace na jedno kliknutí na stránce hostingu aplikací. Instaluje se a sestavuje při prvním startu serveru, data jsou v SQLite na serveru, takže zabezpečení začíná ihned po prvním startu: otevři /admin, vytvoř Super Admina a projdi kroky z tohoto návodu dřív, než adresu někomu předáš. Slot proxy vydá certifikát, jakmile záznam A míří na zobrazenou adresu, a skutečná IP klienta přichází v X-Forwarded-For, což je důležité pro omezení četnosti výše.

Existuje i druhá sada oprávnění, kterou stojí za to použít, a to oprávnění samotného panelu. Subuživatelům serveru lze přidělit detailní oprávnění, například jen konzole nebo jen soubory, a každý server má protokol aktivit, takže ten, kdo potřebuje jen číst logy, nemusí umět upravovat soubor .env, kde leží tajné klíče tvého Strapi. O lidech a rolích v panelu se dočteš v návodech. Zapni TOTP dvoufázové přihlášení i pro svůj vlastní účet v panelu: kdo ovládá tvůj účet v panelu, ovládá správce souborů, a s ním každé tajemství v projektu.

Soubor .env Strapi leží ve složce projektu a můžeš ho upravit ve správci souborů nebo přes SFTP. Protože se role, oprávnění a API tokeny ukládají do databáze, chrání je slot zálohy pořízené na požádání nebo na záložce Schedules; občas nějakou obnov, abys ověřil, že funguje, protože tokeny se vrátí jen tehdy, když je sůl v .env stejná jako dřív.

Ověření zabezpečení#

Tento krátký seznam projdi po každé změně rolí a na každém novém prostředí. Zabere pět minut a odhalí běžné chyby.

  1. Anonym, zavřený typ. Spusť curl -i na typ obsahu, který jsi neotevřel. Očekávej 403.
  2. Anonym, otevřený typ. Spusť curl -i na ten, který jsi otevřel. Očekávej 200 a jen pole, která jsi chtěl zveřejnit.
  3. Anonym, zápis. Spusť curl -i -X POST na otevřenou kolekci s malým tělem JSON ve tvaru {"data":{}}. Očekávej 403.
  4. Anonym, uživatelé. curl -i https://cms.example.com/api/users. Očekávej 403.
  5. Registrace. curl -i -X POST https://cms.example.com/api/auth/local/register s tělem JSON. Pokud jsou registrace vypnuté, očekávej chybu, ne nový účet a JWT.
  6. Token, v rozsahu. Vyžádej si to, k čemu token slouží. Očekávej 200.
  7. Token, mimo rozsah. Vyžádej si něco, na co by neměl dosáhnout. Očekávej 403.
  8. Špatný token. Změň jeden znak. Očekávej 401.
  9. Admin účty. Projdi Settings, Administration Panel, Users a smaž nebo deaktivuj každého, koho neznáš. Spočítej Super Adminy.
  10. Seznam API Tokens. Smaž každý token s názvem, který nikdo neumí vysvětlit, a každý token Full access, který jde nahradit tokenem Custom.

Když kontrola selže, neopravuj to jen v rozhraní. Zapiš si, jaký má být správný stav, nastav ho a spusť kontrolu znovu. Stránku s oprávněními je snadné přečíst špatně, stavový kód ne.

Řešení problémů#

`403 Forbidden` na typu, který jsi otevřel. Role byla uložena, ale požadavek se přiřadil k jiné. Zkontroluj, jestli jsi neposlal hlavičku Authorization: platné JWT koncového uživatele používá roli Authenticated, která má vlastní mřížku oprávnění a nemusí mít to, co Public. Ověř také, že je zaškrtnutá správná akce, find nebo findOne; záznam načítaný podle ID potřebuje findOne.

`401 Unauthorized` s tokenem, který vypadal správně. Mezera nebo nový řádek na začátku či na konci hodnoty, chybějící předpona Bearer , token po uplynutí platnosti, nebo změněný API_TOKEN_SALT. Vytvoř nový token, abys vyloučil sůl.

`403` u tokenu po úpravě. Přepnul jsi typ na Custom a uložil bez zaškrtnutí čehokoli. Token Custom bez akcí nepovoluje nic.

Všechny tokeny přestaly fungovat po migraci. Sůl se liší od té, se kterou byly tokeny zahashovány. Obnov API_TOKEN_SALT z .env starého prostředí, nebo vydej nové tokeny a aktualizuj každého konzumenta.

Oprávnění zmizela na znovu vytvořeném serveru. Byla v databázi a databáze je nová. Obnov zálohu, která ji obsahuje, nebo použij funkci bootstrap jako výše.

Nový typ obsahu frontend nevidí. Začíná zavřený. Otevři find a findOne na správné roli nebo tokenu a otestuj znovu.

V Settings chybí stránka Roles. Tvoje admin role nemá právo číst role. Požádej Super Admina.

FAQ#

Jaký je rozdíl mezi rolí Public a API tokenem?

Role Public platí pro každého, kdo neposílá žádné přihlašovací údaje, takže její oprávnění jsou otevřená celému internetu. API token platí jen pro požadavky, které ho nesou, a má vlastní seznam oprávnění. Public používej pro data, která smí číst celý svět, a token typu Custom pro vše ostatní, co software potřebuje.

Je bezpečné dát token Read-only do frontendu?

Ne do bundlu v prohlížeči. Read-only brání zápisu, ale čte všechny typy obsahu, i ty, které jsi nechtěl publikovat, a kdokoli ho může zkopírovat ze zdroje stránky. Použij ho jen v serverovém kódu nebo v kroku sestavení.

Dá se vytvořit API token, který čte jen jeden typ obsahu?

Ano. Vytvoř token typu Custom a zaškrtni find a findOne jen pro tento typ obsahu. Na jiném typu ověř, že odpoví 403.

Jak zabránit cizím lidem v registraci účtů?

V Settings, Users and Permissions plugin, Advanced settings vypni Enable sign-ups. Potom pošli POST na /api/auth/local/register a ověř, že se účet nevytvořil. Pokud registraci potřebuješ, nech zapnuté potvrzení e-mailu a omez četnost požadavků na tuto cestu.

Proč API token Strapi po novém nasazení přestane fungovat?

Téměř vždy proto, že se změnil API_TOKEN_SALT. Tokeny se hashují touto solí, takže jiná hodnota udělá všechny uložené tokeny nerozpoznatelnými. Drž produkční .env při sestavováních beze změny.

Přenášejí se role a oprávnění spolu s kódem?

Ne. Jsou uložené v databázi. Nasazení ani archiv strapi export je na jiné prostředí spolehlivě nepřenesou, takže je na každém zkontroluj, nebo nastav oprávnění Public ve funkci bootstrap, aby nové prostředí začínalo se správným seznamem.

Pomohlo vám to?