User Authentication με PHP: Ανάπτυξη Βήμα Βήμα & Βέλτιστες Πρακτικές

By Collegelink Team

Author: Ιωάννης Παπίκας, Product @ Orfium | PHP & SQL Instructor @ Web Development Academy by CollegeLink

Πηγές άρθρου: συναρτήσεις κατακερματισμούpassword_hashpassword_verify, jwt

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

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

Προαπαιτούμενα

Disclaimer alert: σε αυτό το άρθρο θα χρησιμοποιήσουμε ορολογία και συναρτήσεις σχετικές με την γλώσσα php και την βάση δεδομένων MySQL. Κατά τα άλλα, όλες οι υπόλοιπες θεωρίες είναι ανεξάρτητες από τη γλώσσα προγραμματισμού.

Διαχείριση Χρηστών

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

Στην πιο απλή τους μορφή, τα στοιχεία του χρήστη θα μπορούσαν να έχουν την παρακάτω μορφή (πίνακας βάσης δεδομένων):

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

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

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

Ο λόγος για τον οποίο θέλουμε να κατακερματίσουμε τον κωδικό πρόσβασης είναι καθαρά για λόγους ασφαλείας ώστε να εξασφαλίσουμε ότι ο κωδικός δεν θα γίνει γνωστός σε περίπτωση που πέσει σε λάθος χέρια η βάση δεδομένων. Πιο συγκεκριμένα, οι συναρτήσεις κατακερματισμού προσφέρουν μια εύκολη στη χρήση μετατροπή χαρακτήρων από τους οποίους δεν μπορούμε να μαντέψουμε το αρχικό κείμενο (όπως θα κάναμε σε μια κανονική διαδικασία κρυπτογράφησης – αποκρυπτογράφησης).

Προτείνουμε την χρήση των συναρτήσεων password_hash και password_verify για την αποθήκευση και επαλήθευση κωδικών πρόσβασης του χρήστη, οι οποίοι αφενός είναι native της γλώσσας php και αφετέρου προσφέρουν επιπλέον επίπεδα κατακερματισμού.

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

Σύνδεση Χρήστη

Η σύνδεση του χρήστη είναι μια διαδικασία 2 βημάτων που πρέπει να υλοποιούμε κάθε φορά που ένας χρήστης κάνει submit τα στοιχεία του στην φόρμα σύνδεσης.

Βήμα Πρώτο – Αυθεντικοποίηση Χρήστη

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

  1. Ανάκτηση του χρήστη σύμφωνα με το email που έχει πληκτρολογήσει
  2. Επαλήθευση του κωδικού πρόσβασης

 

Σε κάθε βήμα από τα παραπάνω το πιο είναι σωστό να εμφανίζουμε ένα διαφορετικό μήνυμα σφάλματος στον χρήστη, ώστε να είναι ξεκάθαρο το πρόβλημα που προέκυψε.

Βήμα Δεύτερο – Αποθήκευση του Συνδεδεμένου Χρήστη

Το δεύτερο βήμα είναι η προσωρινή αποθήκευση του συνδεδεμένου χρήστη ώστε να τον θυμάται η εφαρμογή μας. Σε αυτή την διαδικασία θα κάνουμε χρήση των cookies του browser ώστε να μπορέσουμε να αποθηκεύσουμε την κατάσταση του χρήστη και να παραμένει συνδεδεμένος για ένα συγκεκριμένο χρονικό διάστημα.

Το πρώτο κομμάτι της διαδικασίας είναι η δημιουργία ενός token το οποίο θα είναι hard-to-copy από έναν κακόβουλο χρήστη. Μπορούμε να χρησιμοποιήσουμε τεχνολογίες και βιβλιοθήκες όπως το jwt και να δημιουργήσουμε tokens τα οποία θα περιέχουν τις πληροφορίες του χρήστη που χρειαζόμαστε.

Αφού δημιουργήσουμε το token, μπορούμε απλά να δώσουμε οδηγίες στον browser να το κρατήσει σε ένα cookie ώστε να μπορούμε να το χρησιμοποιούμε κάθε φορά που στέλνουμε ένα request στον server.

Βήμα Τρίτο – Διάρκεια αποθήκευσης token

Στο τρίτο βήμα ορίζουμε το χρονικό διάστημα που θα κρατήσουμε το token στα cookies του χρήστη. Σε αυτό το κομμάτι έχουμε 3 επιλογές:

  1. Μέχρι να κλείσει τον browser
  2. Για συγκεκριμένο χρονικό διάστημα
  3. Για πάντα

 

Στην πρώτη περίπτωση ορίζουμε ότι το cookie θα διαρκέσει για αυτό το session (δηλαδή δεν του δίνουμε duration) και θα σβήσει αυτόματα όταν κλείσουμε εντελώς τον browser (παίζει και ποτέ, ποιος τον κλείνει τώρα άλλωστε;;).

Στην δεύτερη περίπτωση μπορούμε να ορίσουμε ότι το cookie θα λήξει μετά από 1 μήνα και έτσι αυτόματα αποσυνδέουμε τον χρήστη.

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

Πως όμως να επιλέξουμε τη σωστή διάρκεια;

Η διάρκεια σύνδεσης του χρήστη συνδέεται άμεσα με (α) την εμπειρία του χρήστη και (β) την ασφάλειά του. Σε απλές εφαρμογές στις οποίες ο χρήστης απλά έχει πρόσβαση σε προσωποποιημένες πληροφορίες, καλό είναι να τον κρατάμε συνδεδεμένο για μεγάλο χρονικό διάστημα. Σε εφαρμογές οι οποίες περιλαμβάνουν χρηματικές συναλλαγές ή αντίστοιχες ενέργειες πολλοί επιλέγουν να αποσυνδέσουν τον χρήστη μετά από μικρό χρονικό διάστημα, ανεξαρτήτως της δραστηριότητας του χρήστη. Ωστόσο, υπάρχουν εναλλακτικές όπως η επιβεβαίωση του χρήστη με τον κωδικό πρόσβασης για ενέργειες όπως χρηματικές συναλλαγές.

Αποσύνδεση Χρήστη

Με βάση τα όσα έχουμε αναφέρει παραπάνω, η αποσύνδεση του χρήστη από την εφαρμογή είναι το πιο εύκολο κομμάτι. Η μόνη ενέργεια που χρειάζεται να κάνουμε είναι η διαγραφή του cookie από τον browser.

Επόμενα Βήματα

Σε αυτό το άρθρο είδαμε την διαδικασία εγγραφής, σύνδεσης και αποσύνδεσης του χρήστη στην πιο απλή του μορφή. Ωστόσο, δεν είναι η πιο ασφαλής μορφή καθώς υπάρχουν πολλοί τρόποι να υποκλαπεί το token δίνοντας πρόσβαση στον επιτιθέμενο στα στοιχεία του χρήστη, χωρίς δυνατότητα επαναφοράς ή κλειδώματος. Αυτού του είδους η ασφάλεια είναι κάτι που θα δούμε σε επόμενο άρθρο.