OAuth 2.0: τι είναι, πώς λειτουργεί το πρωτόκολλο εξουσιοδότησης

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-04-05 Χρόνος ανάγνωσης: 10 λεπ

Το OAuth 2.0 είναι ένα βιομηχανικό πρωτόκολλο εξουσιοδότησης που παρέχει σε εφαρμογές τρίτων περιορισμένη πρόσβαση σε πόρους χρήστη χωρίς μεταβίβαση των διαπιστευτηρίων του. Το πρωτόκολλο έχει γίνει το de facto πρότυπο για την εκχωρημένη εξουσιοδότηση σε διαδικτυακές και κινητές εφαρμογές, χρησιμοποιούμενο από πλατφόρμες όπως Google, Facebook, Apple και GitHub. Σύμφωνα με το IETF RFC 6749 (2025), το OAuth 2.0 εφαρμόζεται σε περισσότερες από 85% όλων των ενσωματώσεων API που απαιτούν εκχωρημένη πρόσβαση σε δεδομένα.

Βασικά σημεία

  • OAuth 2.0 — πρωτόκολλο εκχωρημένης εξουσιοδότησης που επιτρέπει σε μια εφαρμογή να αποκτά πρόσβαση σε πόρους χρήστη χωρίς μεταβίβαση κωδικού πρόσβασης (IETF RFC 6749)
  • Access Token — προσωρινό διακριτικό πρόσβασης που εκδίδεται από τον διακομιστή εξουσιοδότησης στην εφαρμογή μετά από επιτυχή ταυτοποίηση χρήστη
  • Authorization Code Flow — ο ασφαλέστερος Grant Type για κινητές εφαρμογές, που χρησιμοποιεί code challenge (PKCE) για προστασία από υποκλοπή
  • Refresh Token — μακρόβιο διακριτικό για λήψη νέων Access Token χωρίς εκ νέου σύνδεση του χρήστη στο σύστημα
  • AppAuth — η συνιστώμενη από την IETF βιβλιοθήκη για υλοποίηση OAuth 2.0 σε εγγενείς κινητές εφαρμογές σε Android και iOS

Τι είναι το OAuth 2.0;

OAuth 2.0 — είναι ένα πρωτόκολλο εξουσιοδότησης, που ορίζεται στο IETF RFC 6749, το οποίο επιτρέπει σε εφαρμογές τρίτων να αποκτούν περιορισμένη πρόσβαση σε πόρους χρήστη χωρίς αποκάλυψη του ονόματος χρήστη και κωδικού πρόσβασης. Το πρωτόκολλο λύνει το θεμελιώδες πρόβλημα του μοντέλου κωδικού πρόσβασης: η εφαρμογή στην οποία εμπιστευτήκατε τον κωδικό σας αποκτά απεριόριστη πρόσβαση σε όλα τα δεδομένα του λογαριασμού. Το OAuth 2.0 αντικαθιστά αυτή την προσέγγιση με την έκδοση ενός προσωρινού διακριτικού με ρητά περιορισμένο πεδίο πρόσβασης (scope).

Η αρχιτεκτονική του OAuth 2.0 είναι η εκχωρημένη εξουσιοδότηση. Ο χρήστης (Resource Owner) εξουσιοδοτεί την εφαρμογή (Client) για πρόσβαση στα δεδομένα του που βρίσκονται στον διακομιστή πόρων (Resource Server), μέσω ενός ενδιάμεσου — του διακομιστή εξουσιοδότησης (Authorization Server). Ο διακομιστής εξουσιοδότησης εκδίδει ένα Access Token — μια κρυπτογραφική συμβολοσειρά που η εφαρμογή παρουσιάζει στον διακομιστή πόρων για πρόσβαση στα δεδομένα. Μια σημαντική διαφορά του OAuth 2.0 από τα SAML και OpenID Connect: το OAuth 2.0 επιλύει το ζήτημα της εξουσιοδότησης (τι επιτρέπεται) και όχι της ταυτοποίησης (ποιος είναι ο χρήστης). Για ταυτοποίηση, πάνω από το OAuth 2.0 χτίζεται το πρωτόκολλο OpenID Connect (OIDC).

Το πρωτόκολλο υποστηρίζεται από όλες τις μεγάλες πλατφόρμες. Η Google χρησιμοποιεί OAuth 2.0 για πρόσβαση στα Google APIs (Gmail, Drive, Calendar), το Facebook — για το Graph API, η Apple — για το Sign in with Apple (ASAuthorizationAppleIDProvider), το GitHub — για πρόσβαση σε αποθετήρια. Στο πλαίσιο της ανάπτυξης κινητών εφαρμογών, το OAuth 2.0 είναι ο τυπικός μηχανισμός ενσωμάτωσης υπηρεσιών τρίτων: σύνδεση μέσω κοινωνικών δικτύων, πρόσβαση σε αποθηκευτικά νέφους, δημοσίευση περιεχομένου εκ μέρους του χρήστη.

Ρόλοι και στοιχεία του OAuth 2.0

Το πρωτόκολλο OAuth 2.0 ορίζει τέσσερις ρόλους, η αλληλεπίδραση των οποίων αποτελεί τον πλήρη κύκλο εξουσιοδότησης. Η κατανόηση κάθε ρόλου είναι απαραίτητη για τη σωστή υλοποίηση του πρωτοκόλλου σε μια κινητή εφαρμογή.

Τέσσερις ρόλοι του πρωτοκόλλου

ΡόλοςΠεριγραφήΠαράδειγμα
Resource OwnerΚάτοχος δεδομένων — ο χρήστης που επιτρέπει πρόσβαση στους πόρους τουΧρήστης εφαρμογής που πατά «Σύνδεση μέσω Google»
ClientΕφαρμογή που ζητά πρόσβαση σε πόρους εκ μέρους του κατόχουΚινητή εφαρμογή που χρειάζεται πρόσβαση στο Google Drive
Authorization ServerΔιακομιστής που εκδίδει διακριτικά μετά από ταυτοποίηση και εξουσιοδότησηaccounts.google.com — διακομιστής εξουσιοδότησης Google
Resource ServerAPI που παρέχει πρόσβαση σε προστατευμένους πόρους μέσω διακριτικούwww.googleapis.com — διακομιστής πόρων Google Drive API

Οι βασικές οντότητες του πρωτοκόλλου είναι το Access Token, το Refresh Token και το Authorization Code. Το Access Token είναι ένα βραχύβιο διακριτικό (συνήθως 15–60 λεπτά) που παρουσιάζεται στον διακομιστή πόρων σε κάθε αίτημα δεδομένων. Το Refresh Token είναι ένα μακρόβιο διακριτικό (ημέρες ή εβδομάδες) που χρησιμοποιείται για λήψη νέου Access Token χωρίς εκ νέου σύνδεση του χρήστη. Το Authorization Code είναι ένας προσωρινός κωδικός που εκδίδεται μετά την εξουσιοδότηση του χρήστη και ανταλλάσσεται με Access Token και Refresh Token.

Grant Types: σενάρια εξουσιοδότησης

Το OAuth 2.0 ορίζει διάφορους Grant Types — σενάρια λήψης διακριτικού, καθένα από τα οποία προορίζεται για συγκεκριμένο τύπο πελάτη και περιβάλλον ασφαλείας. Η επιλογή του σωστού Grant Type είναι μια κρίσιμη αρχιτεκτονική απόφαση κατά τον σχεδιασμό της εξουσιοδότησης σε μια κινητή εφαρμογή.

Οι κύριοι Grant Types: Authorization Code (ο ασφαλέστερος για κινητές και διαδικτυακές εφαρμογές με διακομιστή), Authorization Code με PKCE (Proof Key for Code Exchange — για κινητές και SPA εφαρμογές χωρίς διακομιστή), Client Credentials (για αυθεντικοποίηση server-to-server χωρίς συμμετοχή χρήστη), Resource Owner Password Credentials (παλαιωμένο — απευθείας μεταβίβαση κωδικού πρόσβασης). Το PKCE είναι υποχρεωτική επέκταση για δημόσιους πελάτες (κινητές εφαρμογές, SPA) σύμφωνα με τις συστάσεις OAuth Security BCP (RFC 9700).

Κύριοι Grant Types

  • Authorization Code + PKCE — ο συνιστώμενος Grant Type για εγγενείς κινητές εφαρμογές. Ο πελάτης δημιουργεί έναν κρυπτογραφικό code_verifier, υπολογίζει το code_challenge (SHA-256 hash), και ο διακομιστής ελέγχει την αντιστοιχία κατά την ανταλλαγή κωδικού για διακριτικό. Αυτό αποτρέπει την υποκλοπή του authorization code μεταξύ εφαρμογής και διακομιστή
  • Client Credentials — χρησιμοποιείται για εξουσιοδότηση machine-to-machine, όπου ο πελάτης είναι γνωστός και ταυτοποιημένος. Η εφαρμογή λαμβάνει διακριτικό χρησιμοποιώντας το client_id και το client_secret της. Δεν απαιτεί συμμετοχή χρήστη. Τυπικό σενάριο: μια εφαρμογή διακομιστή καλεί ένα API για μαζική επεξεργασία δεδομένων
  • Device Authorization Grant — για συσκευές χωρίς πρόγραμμα περιήγησης (Smart TV, IoT). Ο χρήστης μεταβαίνει σε έναν σύνδεσμο σε άλλη συσκευή και εισάγει έναν κωδικό. Χρησιμοποιείται, για παράδειγμα, κατά την εξουσιοδότηση Netflix σε τηλεόραση μέσω smartphone
  • Resource Owner Password Credentials — παλαιωμένος Grant Type, απαγορευμένος από το OAuth Security BCP. Ο κωδικός πρόσβασης μεταβιβάζεται απευθείας στον πελάτη, παραβιάζοντας την αρχή της αυθεντικοποίησης μηδενικής γνώσης. Χρησιμοποιείται μόνο για μετεγκατάσταση από παλαιωμένα συστήματα

Authorization Code Flow με PKCE για κινητές εφαρμογές

Authorization Code Flow με PKCE — είναι η συνιστώμενη διαμόρφωση OAuth 2.0 για εγγενείς κινητές εφαρμογές. Το PKCE (Proof Key for Code Exchange) προσθέτει ένα επιπλέον επίπεδο προστασίας, αποτρέποντας την επίθεση υποκλοπής authorization code (authorization code interception attack). Το πρωτόκολλο περιγράφεται στο IETF RFC 7636.

Βήμα προς βήμα ακολουθία PKCE

Ακολουθία βημάτων: (1) ο πελάτης δημιουργεί έναν τυχαίο code_verifier (συμβολοσειρά 43–128 χαρακτήρων, only unreserved characters), (2) ο πελάτης υπολογίζει code_challenge = SHA-256(code_verifier), (3) ο πελάτης ανοίγει το πρόγραμμα περιήγησης για εξουσιοδότηση χρήστη στον Authorization Server, μεταβιβάζοντας το code_challenge, (4) μετά από επιτυχή εξουσιοδότηση, ο διακομιστής επιστρέφει authorization code στην εφαρμογή μέσω μιας προσαρμοσμένης URI scheme (app deep link), (5) ο πελάτης στέλνει στον διακομιστή το authorization code + code_verifier, (6) ο διακομιστής ελέγχει SHA-256(code_verifier) === code_challenge και εκδίδει Access Token + Refresh Token.

Το πλεονέκτημα του PKCE — ακόμα κι αν ένας εισβολέας υποκλέψει το authorization code στην URI-σχήμα, δεν μπορεί να το ανταλλάξει για διακριτικό χωρίς το code_verifier, το οποίο είναι γνωστό μόνο στον νόμιμο πελάτη. Σε κινητές εφαρμογές για το άνοιγμα του προγράμματος περιήγησης θα πρέπει να χρησιμοποιούνται Chrome Custom Tabs (Android) ή ASWebAuthenticationSession (iOS) — αυτό εγγυάται ότι το πρόγραμμα περιήγησης συστήματος δεν έχει πρόσβαση στο code_verifier από τη μνήμη της εφαρμογής.

Υλοποίηση OAuth 2.0 σε Android μέσω AppAuth

AppAuth — είναι μια πρότυπη υλοποίηση OAuth 2.0 και OpenID Connect για εγγενείς εφαρμογές, συνιστώμενη από την IETF. Η βιβλιοθήκη υποστηρίζει PKCE, Chrome Custom Tabs, προσαρμοσμένα URI-σχήματα για επιστροφή authorization code και αυτόματη ανανέωση διακριτικών. Το AppAuth για Android είναι διαθέσιμο μέσω της dependency `net.openid:appauth:0.11.1`.

kotlin
val serviceConfig = AuthorizationServiceConfiguration.fromUrl(
    Uri.parse("https://accounts.google.com/.well-known/openid-configuration")
)

val request = AuthorizationRequest.Builder(
    serviceConfig,
    "CLIENT_ID.apps.googleusercontent.com",
    ResponseTypeValues.CODE,
    Uri.parse("com.example.app:/oauth2callback")
)
.setScope("openid profile email")
.setCodeVerifier(
    CodeVerifierUtil.generateRandomCodeVerifier()
)
.build()

val authService = AuthorizationService(context)
val intent = authService.getAuthorizationRequestIntent(request)

// Εκκίνηση Chrome Custom Tab για εξουσιοδότηση
startActivityForResult(intent, REQUEST_CODE_AUTH)

Μετά τη λήψη του authorization code (onActivityResult), η εφαρμογή το ανταλλάσσει για Access Token και Refresh Token μέσω TokenRequest. Τα διακριτικά αποθηκεύονται σε SharedPreferences με κρυπτογράφηση μέσω EncryptedSharedPreferences (Android Security Crypto). Το Refresh Token πρέπει να αποθηκεύεται στο KeyStore — το υλικό αποθετήριο κλειδιών, μη προσβάσιμο για ανάγνωση από άλλες εφαρμογές. Κάθε φορά που το Access Token λήγει, η εφαρμογή χρησιμοποιεί το Refresh Token για να λάβει ένα νέο — ο χρήστης δεν χρειάζεται να συνδεθεί ξανά.

kotlin
// Ανταλλαγή authorization code για tokens
val data = intent?.data ?: return
val resp = AuthorizationResponse.fromIntent(data)
val exchangeReq = resp?.createTokenExchangeRequest()
    ?: return

authService.performTokenRequest(
    exchangeReq,
    ClientAuthentication.none()
) { tokenResp, ex ->
    if (tokenResp != null) {
        // Access Token και Refresh Token ελήφθησαν
        val accessToken = tokenResp.accessToken
        val refreshToken = tokenResp.refreshToken
        // Αποθήκευση σε EncryptedSharedPreferences
        saveTokens(accessToken, refreshToken)
    }
}

Ο παραπάνω κώδικας δείχνει τον πλήρη κύκλο OAuth 2.0 με PKCE: δημιουργία διαμόρφωσης διακομιστή μέσω OpenID Connect Discovery, δημιουργία αιτήματος εξουσιοδότησης με code_verifier, εκκίνηση Chrome Custom Tab, λήψη authorization code μέσω προσαρμοσμένου URI-σχήματος και ανταλλαγή κωδικού για διακριτικά μέσω Token Request. Είναι σημαντικό να διαχειρίζεστε τη λήξη του Access Token: όταν λαμβάνετε HTTP απάντηση 401 από τον Resource Server, η εφαρμογή πρέπει να χρησιμοποιεί το Refresh Token για να λάβει νέο Access Token και να εκτελέσει ξανά το αίτημα.

Ασφάλεια OAuth 2.0: τυπικές επιθέσεις και προστασία

OAuth 2.0 — ένα σύνθετο πρωτόκολλο με πολλαπλά σημεία επίθεσης. Το IETF Security BCP (RFC 9700) περιγράφει περισσότερες από 20 κατηγορίες τρωτών σημείων του OAuth 2.0. Για κινητές εφαρμογές, τα πιο κρίσιμα είναι: υποκλοπή authorization code μέσω προσαρμοσμένων URI-σχημάτων, επιθέσεις CSRF στα callback endpoints, κλοπή Refresh Token από μη ασφαλή αποθηκευτικά μέσα και υποκατάσταση πελάτη μέσω υποκλοπής intent.

Η προστασία από αυτές τις επιθέσεις περιλαμβάνει υποχρεωτικά μέτρα: (1) PKCE με S256 code_challenge — αποτρέπει την υποκλοπή authorization code ακόμα και σε περίπτωση υποκλοπής URI-σχήματος· (2) χρήση nonce ή state parameter για αποτροπή CSRF — ο διακομιστής ελέγχει ότι το authorization code αντιστοιχεί στο αρχικό αίτημα· (3) αποθήκευση Refresh Token μόνο σε KeyStore (Android) ή Keychain (iOS) — ούτε σε SharedPreferences, ούτε σε UserDefaults· (4) χρήση TLS με Certificate Pinning για προστασία MITM σε επίπεδο μεταφοράς· (5) έλεγχος redirect_uri — ο διακομιστής εξουσιοδότησης πρέπει να επικυρώνει αυστηρά την αντιστοιχία με το καταχωρημένο URI.

Επιπρόσθετες συστάσεις από την IETF: οι κινητές εφαρμογές θα πρέπει να χρησιμοποιούν AppAuth ή παρόμοιες βιβλιοθήκες που έχουν υποβληθεί σε έλεγχο ασφαλείας· να μη βασίζονται στο WebView για OAuth (το WebView δεν απομονώνει δεδομένα από την κύρια εφαρμογή)· να υλοποιούν αυτόματη εναλλαγή Refresh Token (ένα Refresh Token μπορεί να χρησιμοποιηθεί μόνο μία φορά)· να προσθέτουν Certificate Pinning μέσω TrustManager για Android και URLSession για iOS. Το OpenID Connect Discovery (well-known endpoint) βοηθά στον αυτόματο προσδιορισμό των σωστών endpoints του διακομιστή εξουσιοδότησης και στην αποφυγή ανακατευθύνσεων σε σελίδες phishing.

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

Ποια είναι η διαφορά μεταξύ OAuth 2.0 και OpenID Connect;

OAuth 2.0 — πρωτόκολλο εξουσιοδότησης (τι επιτρέπεται να γίνει;), ενώ το OpenID Connect (OIDC) — πρωτόκολλο ταυτοποίησης (ποιος είναι ο χρήστης;). Το OIDC χτίζεται πάνω από το OAuth 2.0 και προσθέτει το ID Token — ένα JWT διακριτικό που περιέχει πληροφορίες για την ταυτότητα του χρήστη. Το OAuth 2.0 δίνει Access Token, το OIDC το συμπληρώνει με ID Token και UserInfo endpoint για λήψη του προφίλ χρήστη.

Τι είναι το Bearer Token και γιατί είναι επικίνδυνο;

Bearer Token — είναι ένα Access Token που παρουσιάζεται στην HTTP κεφαλίδα Authorization: Bearer. Ο κίνδυνός του είναι ότι οποιοσδήποτε κατέχει το διακριτικό μπορεί να αποκτήσει πρόσβαση στον πόρο — το διακριτικό δεν είναι συνδεδεμένο με τον πελάτη. Γι' αυτό, το Bearer Token πρέπει να μεταδίδεται μόνο μέσω TLS (HTTPS), να έχει σύντομη διάρκεια ζωής (15–60 λεπτά) και να μην αποθηκεύεται ποτέ σε αρχεία καταγραφής ή παραμέτρους URL.

Γιατί το PKCE είναι υποχρεωτικό για κινητές εφαρμογές;

Οι κινητές εφαρμογές είναι δημόσιοι πελάτες, που δεν διαθέτουν client_secret (το μυστικό δεν μπορεί να προστατευθεί σε APK/IPA). Χωρίς PKCE, ένας εισβολέας μπορεί να υποκλέψει το authorization code μέσω ενός προσαρμοσμένου URI-σχήματος (π.χ. malformed://callback?code=ABC) και να το ανταλλάξει για διακριτικό. Το PKCE προσθέτει το code_verifier, γνωστό μόνο στην εφαρμογή, καθιστώντας τον υποκλεμμένο κωδικό άχρηστο.

Πόσο συχνά χρειάζεται να ανανεώνεται το Access Token;

Ένα τυπικό Access Token διαρκεί 15–60 λεπτά (ρυθμίζεται από τον διακομιστή εξουσιοδότησης). Σε κάθε HTTP αίτημα προς τον Resource Server ελέγχεται η απάντηση: εάν ο κωδικός είναι 401, η εφαρμογή καλεί το Refresh Token Flow για να λάβει νέο Access Token. Το Refresh Token διαρκεί από 24 ώρες έως αρκετούς μήνες, ανάλογα με την πολιτική ασφαλείας του παρόχου. Κατά την αλλαγή Refresh Token, το παλιό ακυρώνεται.

Μπορώ να χρησιμοποιήσω WebView για OAuth 2.0;

Όχι — το IETF Security BCP (RFC 9700) απαγορεύει το WebView για OAuth 2.0 σε κινητές εφαρμογές. Το WebView δεν απομονώνει cookies και δεδομένα από την κύρια εφαρμογή, επιτρέποντας στην εφαρμογή να υποκλέψει τα διαπιστευτήρια του χρήστη. Αντί για WebView, χρησιμοποιήστε Chrome Custom Tabs (Android) ή ASWebAuthenticationSession (iOS) — στοιχεία συστήματος περιήγησης απομονωμένα από την εφαρμογή.

Σύνοψη

  • OAuth 2.0 — πρωτόκολλο εκχωρημένης εξουσιοδότησης (IETF RFC 6749), που αντικαθιστά τη μεταβίβαση κωδικού πρόσβασης με προσωρινά διακριτικά περιορισμένου πεδίου πρόσβασης
  • Authorization Code + PKCE — υποχρεωτικός Grant Type για κινητές εφαρμογές, που προστατεύει από υποκλοπή authorization code μέσω URI-σχημάτων
  • Access Token — βραχύβιο διακριτικό (15–60 λεπτά), που παρουσιάζεται στον Resource Server σε κάθε αίτημα δεδομένων
  • Refresh Token — μακρόβιο διακριτικό για απρόσκοπτη ανανέωση Access Token χωρίς εκ νέου σύνδεση χρήστη
  • AppAuth — πρότυπη βιβλιοθήκη OAuth 2.0 για Android και iOS με υποστήριξη PKCE, Custom Tabs και KeyStore
  • WebView απαγορεύεται — το OAuth 2.0 πρέπει να εκτελείται μέσω προγράμματος περιήγησης συστήματος (Custom Tabs / ASWebAuthenticationSession) σύμφωνα με το IETF RFC 9700
  • OpenID Connect — πρωτόκολλο ταυτοποίησης πάνω από OAuth 2.0, που προσθέτει ID Token (JWT) για αναγνώριση χρήστη

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης