# Tajni API ključ u Expo aplikaciji: što zaštititi

> Javni Supabase ključ, serverska tajna, Expo varijable: razlikuj što smije u iPhone aplikaciju i testiraj pristup s dva računa.

Izvorna stranica: [Tajni API ključ u Expo aplikaciji: što zaštititi](https://devoria.fr/hr/blog/tajni-api-kljuc-expo-aplikacija)
Autor: [Mehdi Azizi](https://devoria.fr/hr/mehdi-azizi)
Objavljeno: 2026-09-29
Zadnja revizija sadržaja: 2026-10-09


## Varijabla okruženja nije nužno tajna

U Expo aplikaciji varijabla s prefiksom `EXPO_PUBLIC_` namijenjena je kodu aplikacije. U njoj ne smije biti serverska tajna. Expo objašnjava da se te vrijednosti ugrađuju u kompajlirani JavaScript i da ih korisnici aplikacije mogu pročitati. Dakle, premjestiti ključ u datoteku `.env` nije dovoljno da ga zaštitiš. [Izvor: Expo varijable okruženja](https://docs.expo.dev/guides/environment-variables/).

Prije nego što zamoliš AI da „spoji API”, razvrstaj što mu daješ: adresu servisa, ključ koji je predviđen da bude javan ili ključ koji dopušta privilegirane radnje. O tom razvrstavanju ovisi gdje se kod mora izvršavati.

Sljedeća tablica je okvir za dizajn, a ne revizija tvoje aplikacije.

| Element                                         | Gdje ga staviti                                 | Što provjeriti                                                                           |
| ----------------------------------------------- | ----------------------------------------------- | ---------------------------------------------------------------------------------------- |
| Javna adresa backenda                           | Konfiguracija aplikacije                        | Pokazuje na pravo okruženje.                                                             |
| Supabase publishable ključ ili stari anon ključ | Aplikacija, ako su dozvole ispravno postavljene | Pravila nad podacima stvarno blokiraju pristup računu drugog korisnika.                  |
| Supabase secret ili service_role ključ          | Samo server                                     | Ne pojavljuje se ni u mobilnom bundleu ni u logovima dostupnima klijentu.                |
| Tajni ključ AI pružatelja                       | Samo server                                     | Aplikacija zove tvoj server, koji provjerava korisnika i limite prije poziva pružatelju. |

Supabase razlikuje ključeve namijenjene klijentima od tajnih ključeva za pouzdana okruženja. Javni ključ identificira projekt; on ne zamjenjuje dozvole nad podacima. [Izvor: Supabase API ključevi](https://supabase.com/docs/guides/getting-started/api-keys).

## Primjer: izmišljena aplikacija za dnevnik čitanja

Zamisli aplikaciju u kojoj Lea i Sami bilježe svoje knjige i privatne bilješke. Ovaj primjer služi za pripremu testova; ne opisuje rezultate dobivene na nekoj Devoria aplikaciji.

Normalan tok izgleda ispravno: Lea se prijavi i vidi svoje bilješke. Ali to još ne odgovara na važno pitanje: odbija li server Lein zahtjev za Samijevu bilješku?

Filtar u sučelju, poput „prikaži bilješke prijavljenog korisnika”, poboljšava prikaz. No autorizacija se mora primijeniti i na razini podataka. U Supabaseu pravila Row Level Security omogućuju da ograničiš dostupne retke prema sesiji. Supabase preporučuje da ih uključiš za tablice izložene preko API-ja i objašnjava pravila za čitanje i pisanje. [Izvor: Row Level Security](https://supabase.com/docs/guides/database/postgres/row-level-security).

Za svoj testni projekt poveži svaku bilješku s njezinim vlasnikom i zasebno definiraj tko je smije čitati, stvarati, mijenjati i brisati. Provjeri i datoteke: to što je redak u bazi zaštićen ne dokazuje da je slika privatna.

## Test koji trebaš provesti s dva testna računa

Pripremi dva računa koje kontroliraš, s različitom knjigom u svakom i kratkom bilješkom koju ćeš lako prepoznati. Koristi izmišljene podatke u testnom okruženju u kojem to smiješ.

1. **Pročitaj svoju bilješku.** Račun A vidi bilješku A.
2. **Pročitaj B-ovu bilješku s računa A.** Zahtjev ne otkriva njezin privatni sadržaj.
3. **Izmijeni B-ovu bilješku s računa A.** Server odbija; bilješka B ostaje nepromijenjena.
4. **Stvori zapis u ime B-a s računa A.** Server odbija tu dodjelu.
5. **Čitaj bez sesije.** Ne vraća se nikakav privatni sadržaj.
6. **Otvori B-ovu privatnu datoteku s računa A.** Datoteka nije dostupna.

Zapiši stvarni rezultat, testiranu verziju i eventualnu grešku. „Pravila su uključena” nije rezultat testa. [Predložak za testiranje u resursima](https://devoria.fr/hr/resources) može ti poslužiti kao osnova za čuvanje tih dokaza.

## Plaćeni poziv neka ide preko tvog servera

Za funkciju koja sažima knjigu pomoću [AI API-ja](https://devoria.fr/hr/blog/guideline-5-1-2-ai-treca-strana-att-dijeljenje-podataka) tok može biti: aplikacija → tvoj server → pružatelj → tvoj server → aplikacija. Tajni ključ ostaje na serveru. Ta arhitektura sama nije dovoljna: i pristup serveru mora biti kontroliran.

U izmišljenom primjeru server mora, među ostalim, provjeriti sesiju, provjeriti da knjiga pripada toj osobi, ograničiti ponovljene zahtjeve i vratiti razumljivu grešku ako pružatelj ne odgovara. Klijent ne odlučuje sam da korisnik ima plaćeni pristup.

Pripremi četiri testa: neprijavljen korisnik, knjiga drugog računa, dosegnut limit i nedostupan pružatelj. Zadnji ti omogućuje da provjeriš izlazi li aplikacija iz stanja učitavanja bez gubitka unosa.

## Što možeš tražiti od svog asistenta za kod

Evo uputa za pregled koje prilagodiš svom repozitoriju, bez lijepljenja tajnih vrijednosti:

> Popiši varijable koje koriste mobilni kod i server, prikazujući samo njihova imena. Identificiraj privilegirane pozive na strani klijenta. Za privatne podatke opiši kontrole čitanja i pisanja, zatim predloži test s dva testna računa. Ne radi nikakvu rotaciju ključeva ni promjene u produkciji bez odobrenja.

Odgovor čitaj uz odgovarajući kod. Asistent može uočiti nedosljednost; njegov odgovor ne zamjenjuje izvršavanje testova. Vodič [napravi aplikaciju s Claude Code](https://devoria.fr/hr/blog/izrada-aplikacije-claude-code-iphone) objašnjava kako podijeliti taj posao.

## Prije nego što nastaviš s aplikacijom

Moraš jednostavno znati objasniti tri stvari: koje su vrijednosti javne, koje operacije idu preko servera i koji testovi pokazuju da jedan račun ne vidi podatke drugoga. Ako ti je nešto od toga nejasno, razjasni to prije dodavanja novih funkcija.

Stranica [napravi iPhone aplikaciju](https://devoria.fr/hr/expertise/izrada-iphone-aplikacije) smješta ovaj korak u cijeli projekt. Da napreduješ redom, [iOS Kit](https://devoria.fr/hr/kits/ios) nudi put u četiri koraka i Starter Code koji već uključuje račune i AI. Ako više ne znaš od kojeg koraka nastaviti, [besplatna dijagnostika](https://devoria.fr/hr/diagnostic) posložit će tvoj projekt i poslati ti moju checklistu protiv Appleovih odbijanja.

## Česta pitanja

### Gdje staviti tajni API ključ u Expo aplikaciji?

Na svoj server, nikad u aplikaciju. Supabase secret ili service_role ključ, kao i tajni ključ AI pružatelja, mora ostati samo na serveru. Aplikacija zove tvoj server, koji provjerava korisnika i limite prije poziva pružatelju. Provjeri da se nijedan od tih ključeva ne pojavljuje ni u mobilnom bundleu ni u logovima dostupnima klijentu.

### Štiti li datoteka .env moj API ključ u Expou?

Ne sama po sebi. Varijabla s prefiksom `EXPO_PUBLIC_` namijenjena je kodu aplikacije i u njoj ne smije biti serverska tajna. Expo objašnjava da se te vrijednosti ugrađuju u kompajlirani JavaScript i da ih korisnici aplikacije mogu pročitati. Dakle, premjestiti ključ u datoteku `.env` nije dovoljno da ga zaštitiš.

### Koja je razlika između javnog i tajnog API ključa?

Javni ključ predviđen je za isporuku u aplikaciji: identificira projekt, ali ne zamjenjuje dozvole nad podacima. Tajni ključ dopušta privilegirane radnje i rezerviran je za pouzdana okruženja. Kod Supabasea publishable ključ, ili stari anon ključ, može ostati u aplikaciji ako su dozvole ispravno postavljene. Secret i service_role ključevi ostaju na serveru.

### Kako pozvati AI API iz Expo aplikacije bez otkrivanja ključa?

Neka poziv ide preko tvog servera: aplikacija zove server, koji zove pružatelja i zatim vraća odgovor aplikaciji. Tajni ključ ostaje na serveru. Server mora i provjeriti sesiju, ograničiti ponovljene zahtjeve i vratiti razumljivu grešku ako pružatelj ne odgovara. Klijent ne odlučuje sam da korisnik ima plaćeni pristup.

### Kako provjeriti da svaki korisnik vidi samo svoje podatke?

Pripremi dva testna računa koje kontroliraš, s prepoznatljivom bilješkom u svakom. S računa A pokušaj čitati, mijenjati i stvarati zapise u ime računa B, pa otvoriti B-ovu privatnu datoteku. Napravi i testove bez sesije: svaki zahtjev mora biti odbijen ili ne smije ništa otkriti. Zapiši stvarni rezultat, jer „pravila su uključena” nije rezultat testa.

### Kako zatražiti od AI-ja da provjeri ključeve moje aplikacije?

Traži da popiše varijable mobilnog koda i servera, prikazujući samo njihova imena, bez lijepljenja tvojih tajnih vrijednosti. Traži i da identificira privilegirane pozive na strani klijenta te predloži test s dva testna računa. Zabrani svaku rotaciju ključeva ili promjenu u produkciji bez odobrenja. Njegov odgovor ne zamjenjuje izvršavanje testova.


## Tvoj projekt

[iOS Kit](https://devoria.fr/hr/kits/ios): Napravi svoju iPhone aplikaciju s Claude Codeom: početni kod mojih aplikacija, skillovi koji provjeravaju njegov rad te Apple Review Kit, App Store Screenshots Kit i ASO Kit. 129,99 €.
