Οι περίοδοι σύνδεσης είναι μια δημοφιλής επιλογή για έλεγχο ταυτότητας χρήστη στον ιστό. Μια περίοδος σύνδεσης είναι μια περίοδος κατά την οποία ένας χρήστης ασχολείται ενεργά με μια εφαρμογή. Η διάρκεια ζωής μιας περιόδου σύνδεσης ξεκινά όταν ένας χρήστης συνδέεται και τελειώνει όταν αποσυνδεθεί.
Το HTTP είναι ένα πρωτόκολλο χωρίς κατάσταση, επομένως θα πρέπει συχνά να παρακολουθείτε τη δραστηριότητα των χρηστών με μη αυτόματο τρόπο.
Στην πλευρά του διακομιστή της εφαρμογής σας, μπορείτε να δημιουργήσετε μια μοναδική τιμή, κατά προτίμηση μια κρυπτογραφικά ασφαλή. Στη συνέχεια, μπορείτε να το αποθηκεύσετε σε ένα cookie το οποίο ο πελάτης θα στείλει στην εφαρμογή σας σε μελλοντικά αιτήματα, δημιουργώντας μια μορφή κατάστασης.
Συνεδρίες στο Go
Μπορείτε να χρησιμοποιήσετε το πακέτο net/http για την υλοποίηση συνεδριών και υπάρχουν πολλά διαθέσιμα πακέτα που το κάνουν ήδη αυτό. Το πιο δημοφιλές είναι το πακέτο συνεδριών Gorilla. Αυτό το πακέτο παρέχει λειτουργία αποθήκευσης cookie και αρχείων παράλληλα με προσαρμοσμένη υποδομή υποστήριξης συνεδρίας.
Εκτελέστε αυτήν την εντολή στον χώρο εργασίας Go για να εγκαταστήσετε το πακέτο συνεδριών Gorilla.
πηγαίνω λάβετε το github.com/gorilla/sessions
Σε αυτό το σεμινάριο, θα χρησιμοποιήσετε ένα κατάστημα cookie για συνεδρίες. Θα χρησιμοποιήσετε το πακέτο net/http για να ξεκινήσετε έναν διακομιστή ιστού που θα ελέγχει το πρόβλημα του χρήστη και θα ανακαλεί τις περιόδους λειτουργίας.
Ακολουθεί η λίστα των εισαγωγών που θα χρειαστείτε για να ακολουθήσετε αυτόν τον οδηγό.
εισαγωγή (
"github.com/gorilla/sessions"
"κούτσουρο"
"net/http"
)
ο κούτσουρο Το πακέτο προορίζεται για λειτουργίες που σχετίζονται με την καταγραφή με βάση την κατάσταση του ελέγχου ταυτότητας του χρήστη.
Μια απλή εφαρμογή Cookie Store
Θα χρειαστείτε ένα κατάστημα cookie για τις λειτουργίες χειρισμού σύνδεσης και αποσύνδεσης. Για το κατάστημά σας cookie, θα χρειαστείτε ένα μυστικό κλειδί για έλεγχο ταυτότητας.
Ακολουθεί μια συνάρτηση για την υλοποίηση του καταστήματος cookie.
// Η συνάρτηση cookieStore δημιουργεί ένα χώρο αποθήκευσης cookie με το μυστικό κλειδί του χρήστη
funccookieStore() *συνεδρίες.CookieStore {
SecretKey := []ψηφιόλεξη("super-secret-SecretKey")
cookieStore := συνεδρίες. NewCookieStore (SecretKey)
Η συνάρτηση // επιστρέφει το χώρο αποθήκευσης cookie ώστε άλλες συναρτήσεις να έχουν πρόσβαση σε αυτό
ΕΠΙΣΤΡΟΦΗ cookieStore
}
Στο cookieStore συνάρτηση, η δηλωμένη μεταβλητή μυστικού κλειδιού Μυστικό κλειδί είναι ένα παράδειγμα μυστικού κλειδιού. Κατά την παραγωγή, το μυστικό κλειδί σας θα πρέπει να είναι κρυπτογραφικά ασφαλές, χρησιμοποιώντας για παράδειγμα το πακέτο κρυπτογράφησης. Θα πρέπει επίσης να φορτώσετε το μυστικό από ένα αρχείο μεταβλητών περιβάλλοντος.
Η συνάρτηση επιστρέφει μια τιμή του *συνεδρίες. CookieStore τύπος που αντιπροσωπεύει το χώρο αποθήκευσης cookie που είναι ασφαλισμένος με το μυστικό κλειδί. Θα χρησιμοποιήσετε το CookieStore λειτουργία σε σας Σύνδεση και Αποσύνδεση χειριστές για τον έλεγχο ταυτότητας χρηστών και την ανάθεση συνεδριών.
Η λειτουργία Login Handler
Θα θέλετε να επαληθεύσετε εάν ο χρήστης είναι ήδη συνδεδεμένος πριν δημιουργήσετε μια περίοδο λειτουργίας στη λειτουργία χειρισμού σύνδεσης. Μπορείτε να χρησιμοποιήσετε το Παίρνω μέθοδο στο χώρο αποθήκευσης cookie για να ανακτήσετε μια περίοδο λειτουργίας από το cookie και να προσθέσετε τη συνεδρία στο αίτημα του πελάτη.
ο Παίρνω μέθοδος επιστρέφει τη συνεδρία και ένα σφάλμα που μπορείτε να χειριστείτε. Εάν χρειάζεται να ελέγξετε την ταυτότητα του χρήστη, μπορείτε να πραγματοποιήσετε έλεγχο ταυτότητας ή εξουσιοδότηση στο Σύνδεση χειριστής.
// Ο χειριστής σύνδεσης ανακτά τη συνεδρία από το Κατάστημα cookie
funcΣύνδεση(συγγραφέας http. ResponseWriter, αίτημα *http. Αίτηση) {
session, err := cookieStore().Λήψη (αίτημα, "Όνομα cookie από αίτημα")αν λάθος!= μηδέν {
κούτσουρο. Fatalln (λάθος)
}// ορίστε τον έλεγχο ταυτότητας χρήστη εδώ με βάση τη λειτουργία
συνεδρία. Τιμές ["κατάσταση ταυτότητας"] = αληθής
err = συνεδρία. Αποθήκευση (αίτημα, συγγραφέας)
αν λάθος!= μηδέν {
ΕΠΙΣΤΡΟΦΗ
}
}
Η ιδιότητα Values διατηρεί τα δεδομένα που σχετίζονται με τη συνεδρία στο χώρο αποθήκευσης cookie:
ο Αποθηκεύσετε μέθοδος αποθηκεύει τη συνεδρία στο χώρο αποθήκευσης cookie. Στους χειριστές σας, θα χρειαστείτε άλλα μέτρα ελέγχου ταυτότητας για υψηλότερη ασφάλεια.
Επαλήθευση της κατάστασης σύνδεσης ενός χρήστη
Ο χειριστής επαλήθευσης θα πρέπει να ανακτήσει τη συνεδρία από το cookie του πελάτη χρησιμοποιώντας το cookie του καταστήματος Παίρνω μέθοδος. Στη συνέχεια, μπορείτε να ανακτήσετε τη συνεδρία και να ελέγξετε την ταυτότητα του χρήστη.
funccheckAuthStatus(συγγραφέας http. ResponseWriter, αίτημα *http. Αίτηση) {
session, err := cookieStore().Λήψη (αίτημα, "Όνομα cookie από αίτημα")αν λάθος!= μηδέν {
κούτσουρο. Fatalln (λάθος)
}πιστοποιημένος := συνεδρία. Τιμές ["κατάσταση ταυτότητας"]
αν πιστοποιημένος == αληθής {
συγγραφέας. WriteHeader (http. Κατάσταση ΟΚ) // γράψτε 200 κωδικό κατάστασης
ΕΠΙΣΤΡΟΦΗ
} αλλού {
συγγραφέας. WriteHeader (http. StatusBadRequest) // γράψτε τον κωδικό κατάστασης 400 http
ΕΠΙΣΤΡΟΦΗ
}
}
ο πιστοποιημένος μεταβλητή χρησιμοποιεί το Αξίες ιδιότητα για ανάκτηση της κατάστασης από το κατάστημα cookie. Στη συνέχεια, η δήλωση if επαληθεύει αυτήν την κατάσταση ελέγχου ταυτότητας. Αν αξιολογεί να αληθής, ο πελάτης λαμβάνει τα 200 Κωδικός κατάστασης HTTP. Εάν η κατάσταση ελέγχου ταυτότητας δεν είναι αληθής, ο πελάτης λαμβάνει τον κωδικό κατάστασης 400 HTTP.
Ο χειριστής αποσύνδεσης συνεδρίας
Η λειτουργία χειρισμού αποσύνδεσής σας θα είναι πολύ παρόμοια με τη λειτουργία χειρισμού σύνδεσης. Θα διαγράψετε όλα τα δεδομένα που σχετίζονται με τη συνεδρία του χρήστη από το χώρο αποθήκευσης cookie και θα ακυρώσετε την κατάσταση ελέγχου ταυτότητας.
funcΑποσύνδεση(συγγραφέας http. ResponseWriter, αίτημα *http. Αίτηση) {
session, err := cookieStore().Λήψη (αίτημα, "Όνομα cookie από αίτημα")αν λάθος!= μηδέν {
ΕΠΙΣΤΡΟΦΗ
}// ακυρώσει τη συνεδρία του χρήστη από το Κατάστημα cookie
συνεδρία. Τιμές ["κατάσταση ταυτότητας"] = ψευδής
err = συνεδρία. Αποθήκευση (αίτημα, συγγραφέας)
αν λάθος!= μηδέν {
ΕΠΙΣΤΡΟΦΗ
}
}
ο Αποσύνδεση Η λειτουργία χειριστή ακυρώνει την κατάσταση ελέγχου ταυτότητας περιόδου λειτουργίας του χρήστη και αποθηκεύει την κατάσταση στο χώρο αποθήκευσης cookie.
Μην αποθηκεύετε ευαίσθητα δεδομένα σε περιόδους σύνδεσης
Οι περίοδοι σύνδεσης είναι ιδανικές για την αποθήκευση δεδομένων, αλλά είναι καλύτερο να αποφύγετε την αποθήκευση ευαίσθητων δεδομένων σε αυτές. Ένας εισβολέας μπορεί να παραβιάσει μια περίοδο λειτουργίας εάν αποθηκεύσετε τα δεδομένα της σε ένα cookie και τα στείλετε μέσω απλού HTTP. Η ασφάλεια της εφαρμογής σας είναι σημαντική για τους χρήστες σας.
Οι περίοδοι λειτουργίας είναι κρατικές και υπάρχουν πολλές υλοποιήσεις βάσεων δεδομένων αποθηκών cookie για το πακέτο Gorilla, τόσο για βάσεις δεδομένων SQL όσο και για βάσεις δεδομένων NoSQL.