# Μυστικό κλειδί API σε εφαρμογή Expo: τι να προστατέψεις

> Δημόσιο κλειδί Supabase, μυστικό server, μεταβλητές Expo: ξεχώρισε τι μπαίνει στην εφαρμογή iPhone και έλεγξε την πρόσβαση με δύο λογαριασμούς.

Αρχική σελίδα: [Μυστικό κλειδί API σε εφαρμογή Expo: τι να προστατέψεις](https://devoria.fr/el/blog/secret-api-key-expo-app-what-to-protect)
Συγγραφέας: [Mehdi Azizi](https://devoria.fr/el/mehdi-azizi)
Δημοσίευση: 2026-09-29
Τελευταία αναθεώρηση περιεχομένου: 2026-10-09


## Μια μεταβλητή περιβάλλοντος δεν είναι απαραίτητα μυστικό

Σε μια εφαρμογή Expo, μια μεταβλητή με πρόθεμα `EXPO_PUBLIC_` προορίζεται για τον κώδικα της εφαρμογής. Δεν πρέπει να περιέχει μυστικό του server. Το Expo εξηγεί ότι αυτές οι τιμές ενσωματώνονται στο μεταγλωττισμένο JavaScript και μπορούν να διαβαστούν από τους χρήστες της εφαρμογής. Άρα το να μεταφέρεις ένα κλειδί σε ένα αρχείο `.env` δεν αρκεί για να το προστατέψεις. [Πηγή: μεταβλητές περιβάλλοντος Expo](https://docs.expo.dev/guides/environment-variables/).

Πριν ζητήσεις από ένα AI να «συνδέσει το API», κατάταξε αυτό που του δίνεις: μια διεύθυνση υπηρεσίας, ένα κλειδί που έχει σχεδιαστεί να είναι δημόσιο, ή ένα κλειδί που επιτρέπει προνομιακές ενέργειες. Αυτή η κατάταξη καθορίζει πού πρέπει να εκτελείται ο κώδικας.

Ο παρακάτω πίνακας είναι ένα πλαίσιο σχεδιασμού, όχι έλεγχος της εφαρμογής σου.

| Στοιχείο                                            | Πού το βάζεις                                         | Τι να ελέγξεις                                                                               |
| --------------------------------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| Δημόσια διεύθυνση του backend                       | Ρυθμίσεις της εφαρμογής                               | Δείχνει στο σωστό περιβάλλον.                                                                |
| Κλειδί Supabase publishable, ή το παλιό κλειδί anon | Στην εφαρμογή, αν τα δικαιώματα έχουν ρυθμιστεί σωστά | Οι κανόνες δεδομένων μπλοκάρουν πραγματικά την πρόσβαση στον λογαριασμό άλλου χρήστη.        |
| Κλειδί Supabase secret ή service_role               | Μόνο στον server                                      | Δεν εμφανίζεται ούτε στο mobile bundle ούτε σε logs προσβάσιμα από τον client.               |
| Μυστικό κλειδί παρόχου AI                           | Μόνο στον server                                      | Η εφαρμογή καλεί τον server σου, που ελέγχει τον χρήστη και τα όρια πριν καλέσει τον πάροχο. |

Το Supabase ξεχωρίζει τα κλειδιά για clients από τα μυστικά κλειδιά για αξιόπιστα περιβάλλοντα. Ένα δημόσιο κλειδί αναγνωρίζει το project· δεν αντικαθιστά τα δικαιώματα στα δεδομένα. [Πηγή: κλειδιά API Supabase](https://supabase.com/docs/guides/getting-started/api-keys).

## Παράδειγμα: μια φανταστική εφαρμογή ημερολογίου ανάγνωσης

Ας φανταστούμε μια εφαρμογή όπου η Λία και ο Σάμι καταγράφουν τα βιβλία τους και τις ιδιωτικές σημειώσεις τους. Το παράδειγμα χρησιμεύει για να προετοιμάσεις τα τεστ· δεν περιγράφει αποτελέσματα από κάποια εφαρμογή της Devoria.

Η κανονική ροή φαίνεται σωστή: η Λία συνδέεται και βλέπει τις σημειώσεις της. Όμως αυτό δεν απαντά ακόμα στη σημαντική ερώτηση: απορρίπτει ο server ένα αίτημα της Λίας για μια σημείωση του Σάμι;

Ένα φίλτρο στο interface, όπως «εμφάνισε τις σημειώσεις του συνδεδεμένου χρήστη», βελτιώνει την εμφάνιση. Η εξουσιοδότηση όμως πρέπει να εφαρμόζεται και στο επίπεδο των δεδομένων. Στο Supabase, οι κανόνες Row Level Security επιτρέπουν να περιορίσεις τις γραμμές που είναι προσβάσιμες ανάλογα με τη session. Το Supabase προτείνει να τους ενεργοποιείς για τους πίνακες που εκτίθενται μέσω του API και εξηγεί τις πολιτικές ανάγνωσης και εγγραφής. [Πηγή: Row Level Security](https://supabase.com/docs/guides/database/postgres/row-level-security).

Για το δικό σου δοκιμαστικό project, σύνδεσε κάθε σημείωση με τον ιδιοκτήτη της και όρισε ξεχωριστά ποιος μπορεί να τη διαβάσει, να τη δημιουργήσει, να την τροποποιήσει και να τη διαγράψει. Έλεγξε και τα αρχεία: το να προστατεύεις μια γραμμή στη βάση δεδομένων δεν αποδεικνύει ότι μια εικόνα είναι ιδιωτική.

## Το σενάριο ελέγχου με δύο δοκιμαστικούς λογαριασμούς

Ετοίμασε δύο λογαριασμούς που ελέγχεις, ένα διαφορετικό βιβλίο στον καθένα και μια μικρή σημείωση που αναγνωρίζεται εύκολα. Χρησιμοποίησε φανταστικά δεδομένα σε ένα εγκεκριμένο δοκιμαστικό περιβάλλον.

1. **Διάβασε τη δική σου σημείωση.** Ο λογαριασμός A βρίσκει τη σημείωση A.
2. **Διάβασε τη σημείωση του B από τον A.** Το αίτημα δεν αποκαλύπτει το ιδιωτικό περιεχόμενό της.
3. **Τροποποίησε τη σημείωση του B από τον A.** Ο server αρνείται· η σημείωση B μένει ίδια.
4. **Δημιούργησε στο όνομα του B από τον A.** Ο server αρνείται αυτή την απόδοση.
5. **Διάβασε χωρίς session.** Δεν επιστρέφεται κανένα ιδιωτικό περιεχόμενο.
6. **Άνοιξε το ιδιωτικό αρχείο του B από τον A.** Το αρχείο δεν είναι προσβάσιμο.

Κατάγραψε το πραγματικό αποτέλεσμα, την έκδοση που δοκιμάστηκε και τυχόν σφάλμα. Το «οι κανόνες είναι ενεργοποιημένοι» δεν είναι αποτέλεσμα τεστ. Το [πρότυπο ελέγχου στους πόρους](https://devoria.fr/el/resources) μπορεί να χρησιμεύσει ως βάση για να κρατάς αυτές τις αποδείξεις.

## Πέρνα τις κλήσεις επί πληρωμή από τον server σου

Για μια λειτουργία που συνοψίζει ένα βιβλίο με [ένα API AI](https://devoria.fr/el/blog/guideline-5-1-2-third-party-ai-att-data-sharing), η ροή μπορεί να είναι: εφαρμογή → server σου → πάροχος → server σου → εφαρμογή. Το μυστικό κλειδί μένει στον server. Αυτή η αρχιτεκτονική δεν αρκεί μόνη της: πρέπει να ελέγχεται και η πρόσβαση στον server.

Στο φανταστικό παράδειγμα, ο server πρέπει μεταξύ άλλων να ελέγχει τη session, να ελέγχει ότι το βιβλίο ανήκει στον χρήστη, να περιορίζει τα επαναλαμβανόμενα αιτήματα και να επιστρέφει ένα κατανοητό σφάλμα αν ο πάροχος δεν απαντά. Ο client δεν αποφασίζει μόνος του ότι ένας χρήστης έχει πρόσβαση επί πληρωμή.

Ετοίμασε τέσσερα τεστ: μη συνδεδεμένος χρήστης, βιβλίο άλλου λογαριασμού, όριο που έχει εξαντληθεί και πάροχος μη διαθέσιμος. Το τελευταίο σου επιτρέπει να ελέγξεις ότι η εφαρμογή βγαίνει από την κατάσταση φόρτωσης χωρίς να χάσει ό,τι πληκτρολόγησε ο χρήστης.

## Τι μπορείς να ζητήσεις από τον βοηθό κώδικα

Να μια οδηγία review που προσαρμόζεις στο repo σου, χωρίς να επικολλήσεις τις μυστικές τιμές σου:

> Κατάγραψε τις μεταβλητές που χρησιμοποιούνται από τον mobile κώδικα και από τον server, εμφανίζοντας μόνο τα ονόματά τους. Εντόπισε τις προνομιακές κλήσεις που υπάρχουν στην πλευρά του client. Για τα ιδιωτικά δεδομένα, περίγραψε τους ελέγχους ανάγνωσης και εγγραφής και πρότεινε ένα σενάριο ελέγχου με δύο δοκιμαστικούς λογαριασμούς. Μην κάνεις καμία εναλλαγή κλειδιών ή αλλαγή στο production χωρίς έγκριση.

Διάβασε την απάντηση μαζί με τον αντίστοιχο κώδικα. Ένας βοηθός μπορεί να εντοπίσει μια ασυνέπεια· η απάντησή του δεν αντικαθιστά την εκτέλεση των τεστ. Ο οδηγός [φτιάξε εφαρμογή με το Claude Code](https://devoria.fr/el/blog/create-app-claude-code-iphone-tutorial) εξηγεί πώς να χωρίσεις αυτή τη δουλειά σε κομμάτια.

## Πριν συνεχίσεις με την εφαρμογή σου

Πρέπει να μπορείς να εξηγήσεις απλά τρία πράγματα: ποιες τιμές είναι δημόσιες, ποιες λειτουργίες περνούν από τον server και ποια τεστ δείχνουν ότι ένας λογαριασμός δεν βλέπει τα δεδομένα άλλου. Αν κάποιο από αυτά μένει θολό, ξεκαθάρισέ το πριν προσθέσεις λειτουργίες.

Η σελίδα [φτιάξε εφαρμογή iPhone](https://devoria.fr/el/expertise/create-an-iphone-app) τοποθετεί αυτό το βήμα μέσα στο συνολικό project. Για να προχωρήσεις με σειρά, το [iOS Kit](https://devoria.fr/el/kits/ios) προσφέρει μια διαδρομή τεσσάρων βημάτων και έναν αρχικό κώδικα που περιλαμβάνει ήδη λογαριασμούς και AI. Αν δεν ξέρεις πια από ποιο βήμα να συνεχίσεις, η [δωρεάν διάγνωση](https://devoria.fr/el/diagnostic) βάζει το project σου σε σειρά και σου στέλνει τη checklist μου κατά των απορρίψεων της Apple.

## Συχνές ερωτήσεις

### Πού βάζω ένα μυστικό κλειδί API σε εφαρμογή Expo;

Στον server σου, ποτέ στην εφαρμογή. Το κλειδί Supabase secret ή service_role, όπως και το μυστικό κλειδί ενός παρόχου AI, πρέπει να μένει μόνο στον server. Η εφαρμογή καλεί τον server σου, που ελέγχει τον χρήστη και τα όρια πριν καλέσει τον πάροχο. Έλεγξε ότι κανένα από αυτά τα κλειδιά δεν εμφανίζεται στο mobile bundle ούτε σε logs προσβάσιμα από τον client.

### Προστατεύει ένα αρχείο .env το κλειδί API μου στο Expo;

Όχι από μόνο του. Μια μεταβλητή με πρόθεμα `EXPO_PUBLIC_` προορίζεται για τον κώδικα της εφαρμογής και δεν πρέπει να περιέχει μυστικό του server. Το Expo εξηγεί ότι αυτές οι τιμές ενσωματώνονται στο μεταγλωττισμένο JavaScript και μπορούν να διαβαστούν από τους χρήστες της εφαρμογής. Άρα το να μεταφέρεις ένα κλειδί σε ένα αρχείο `.env` δεν αρκεί για να το προστατέψεις.

### Ποια η διαφορά ανάμεσα σε δημόσιο και μυστικό κλειδί API;

Ένα δημόσιο κλειδί έχει σχεδιαστεί για να μπαίνει στην εφαρμογή: αναγνωρίζει το project, αλλά δεν αντικαθιστά τα δικαιώματα στα δεδομένα. Ένα μυστικό κλειδί επιτρέπει προνομιακές ενέργειες και προορίζεται μόνο για αξιόπιστα περιβάλλοντα. Στο Supabase, το κλειδί publishable, ή το παλιό κλειδί anon, μπορεί να μείνει στην εφαρμογή αν τα δικαιώματα έχουν ρυθμιστεί σωστά. Τα κλειδιά secret και service_role μένουν στον server.

### Πώς καλώ ένα API AI από εφαρμογή Expo χωρίς να εκθέσω το κλειδί;

Πέρνα την κλήση από τον server σου: η εφαρμογή καλεί τον server, εκείνος καλεί τον πάροχο και μετά επιστρέφει την απάντηση στην εφαρμογή. Το μυστικό κλειδί μένει στον server. Ο server πρέπει επίσης να ελέγχει τη session, να περιορίζει τα επαναλαμβανόμενα αιτήματα και να επιστρέφει ένα κατανοητό σφάλμα αν ο πάροχος δεν απαντά. Ο client δεν αποφασίζει μόνος του ότι ένας χρήστης έχει πρόσβαση επί πληρωμή.

### Πώς ελέγχω ότι κάθε χρήστης βλέπει μόνο τα δικά του δεδομένα;

Ετοίμασε δύο δοκιμαστικούς λογαριασμούς που ελέγχεις, με μια αναγνωρίσιμη σημείωση στον καθένα. Από τον λογαριασμό A, προσπάθησε να διαβάσεις, να τροποποιήσεις και να δημιουργήσεις στο όνομα του λογαριασμού B, και μετά να ανοίξεις το ιδιωτικό αρχείο του B. Κάνε και τα τεστ χωρίς session: κάθε αίτημα πρέπει να απορρίπτεται ή να μην αποκαλύπτει τίποτα. Κατάγραψε το πραγματικό αποτέλεσμα, γιατί το «οι κανόνες είναι ενεργοποιημένοι» δεν είναι αποτέλεσμα τεστ.

### Πώς ζητάω από ένα AI να ελέγξει τα κλειδιά της εφαρμογής μου;

Ζήτα του να καταγράψει τις μεταβλητές του mobile κώδικα και του server, εμφανίζοντας μόνο τα ονόματά τους, χωρίς να επικολλήσεις τις μυστικές τιμές σου. Ζήτα του επίσης να εντοπίσει τις προνομιακές κλήσεις στην πλευρά του client και να προτείνει ένα σενάριο ελέγχου με δύο δοκιμαστικούς λογαριασμούς. Απαγόρευσε κάθε εναλλαγή κλειδιών ή αλλαγή στο production χωρίς έγκριση. Η απάντησή του δεν αντικαθιστά την εκτέλεση των τεστ.


## Το project σου

[iOS Kit](https://devoria.fr/el/kits/ios): Φτιάξε την app σου για iPhone με το Claude Code: ο κώδικας εκκίνησης των apps μου, τα skills που ελέγχουν τη δουλειά του, και τα Apple Review Kit, App Store Screenshots Kit και ASO Kit. 129,99 €.
