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

Μπορείτε να εφαρμόσετε ένα απλό μοντέλο ελέγχου ταυτότητας χρήστη στο Node.js χρησιμοποιώντας Express, Bcrypt και MongoDB, σε λίγα μόλις βήματα.

Βήμα 1: Ρύθμιση περιβάλλοντος ανάπτυξης

Πρώτα, δημιουργήστε έναν φάκελο έργου και CD σε αυτό τρέχοντας:

mkdir έλεγχος ταυτότητας χρήστη
CD έλεγχος ταυτότητας χρήστη

Στη συνέχεια, αρχικοποιήστε το npm στον κατάλογο του έργου σας εκτελώντας:

npm init -y

ο Το flag αρχικοποιεί το npm και δημιουργεί το δικό σας πακέτο.json αρχείο με όλες τις προεπιλογές του.

Αυτό το μοντέλο ελέγχου ταυτότητας χρήστη απαιτεί μερικές εξαρτήσεις.

Περιλαμβάνουν:

  • Εξπρές: Το Express είναι ένα πλαίσιο Node.js που παρέχει ένα ισχυρό σύνολο δυνατοτήτων για εφαρμογές ιστού και κινητών. Διευκολύνει τη δημιουργία εφαρμογών υποστήριξης με το Node.js.
  • instagram viewer
  • Bcrypt: Το bcrypt είναι ένα πακέτο npm που υλοποιεί τη λειτουργία κατακερματισμού κωδικού πρόσβασης bcrypt. Σας επιτρέπει να δημιουργείτε κατακερματισμούς από απλές συμβολοσειρές κωδικού πρόσβασης.
  • Mongoose: Το Mongoose είναι μια βιβλιοθήκη μοντελοποίησης δεδομένων αντικειμένων MongoDB. Απλοποιεί τις αλληλεπιδράσεις μεταξύ της εφαρμογής σας και μιας βάσης δεδομένων MongoDB.
  • dotenv: το dotenv είναι ένα πακέτο μηδενικής εξάρτησης που φορτώνει μεταβλητές περιβάλλοντος από a .env αρχείο σε διαδικασία.env.
  • Validator: Ο επικυρωτής είναι ένα πακέτο που περιέχει διάφορες συναρτήσεις επικύρωσης συμβολοσειρών.
  • Body-parser: Το πακέτο body-parser αναλύει τα σώματα σε ένα ενδιάμεσο λογισμικό πριν από τους χειριστές σας.

Εγκαταστήστε τα πακέτα εκτελώντας:

npm εγκαθιστώ express bcrypt mongoose dotenv επικυρωτής σώμα- αναλυτής

Στη συνέχεια, δημιουργήστε ένα app.js αρχείο στον ριζικό κατάλογο του έργου σας και προσθέστε το μπλοκ κώδικα παρακάτω για να δημιουργήσετε έναν βασικό διακομιστή Express:

// app.js
συνθ εκφράζω = απαιτώ('εξπρές');
συνθ app = express();
συνθ bodyParser = απαιτώ("αναλυτής σώματος");

συνθ λιμάνι = 3000;

εφαρμογή.χρήση(bodyParser.json());
εφαρμογή.χρήση(bodyParser.urlencoded({ επεκτάθηκε: true }));

app.listen (port, ()=>{
κονσόλα.κούτσουρο(«Η εφαρμογή ακούει στη θύρα ${port}`);
});

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

Βήμα 2: Σύνδεση της εφαρμογής σας σε μια βάση δεδομένων

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

Στη συνέχεια, πλοηγηθείτε στο δικό σας app.js αρχείο και εισαγωγή mongoose:

συνθ μαγκούστα = απαιτώ("μαγκούστα");

Στη συνέχεια, καλέστε την εισαγωγή dotenv και καλέστε το config μέθοδος σε αυτό:

απαιτώ("dotenv").config();

Καλώντας το config μέθοδος για dotenv φορτώνει περιβαλλοντικές μεταβλητές στο διαδικασία.env.

Τέλος, ενεργοποιήστε τη μέθοδο σύνδεσης μαγκούστα και περάστε το MongoDB URI σας ως όρισμα:

mongoose.connect (process.env. MONGODB_URI).τότε(() => {
console.log('Συνδέθηκε με επιτυχία στη βάση δεδομένων')
})

Βήμα 3: Δημιουργία μοντέλου χρήστη

Στον ριζικό κατάλογο του έργου σας, δημιουργήστε ένα "μοντέλα" ντοσιέ; Εδώ θα αποθηκεύσετε το μοντέλο μαγκούστας σας:

μοντέλα mkdir

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

συνθ μαγκούστα = απαιτώ('μαγκούστα')
συνθ { isEmail } = απαιτώ('επικυρωτής')

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

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

// models/userModel
συνθ userSchema = μαγκούστα. Σχήμα({
ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ: {
τύπος: Σειρά,
απαιτείται: [αλήθεια, 'Απαιτείται email'],
επικύρωση: {
επικυρωτής: isEmail,
μήνυμα: props => `${props.value} δεν είναι έγκυρο email».
}
},

Κωδικός πρόσβασης: {
τύπος: Σειρά,
απαιτείται: [αλήθεια, 'Απαιτείται κωδικός'],
επικύρωση: {
επικυρωτής: λειτουργία (αξία) {
ΕΠΙΣΤΡΟΦΗ αξία.μήκος >= 6
},
μήνυμα: () =>'Ο κωδικός πρόσβασης πρέπει να αποτελείται από τουλάχιστον έξι χαρακτήρες'
}
}
})

μονάδα μέτρησης.εξαγωγές = mongoose.model('User', userSchema)

Ο παραπάνω κώδικας δημιουργεί ένα userSchema μεταβλητή που αποθηκεύει την τιμή του μαγκούστα. Σχήμα μέθοδος. Η μαγκούστα. Η μέθοδος Schema αντιστοιχίζει ιδιότητες σε μια συλλογή MongoDB και ορίζει το σχήμα των εγγράφων μέσα σε αυτήν. Το σχήμα μαγκούστας έχει δύο ιδιότητες—ένα ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ και ένα Κωδικός πρόσβασης—που θα είναι οι απαιτήσεις σας για έλεγχο ταυτότητας.

Η ιδιότητα email είναι τύπος συμβολοσειράς και έχει απαιτείται οριστεί σε αληθινό. Το συνοδευτικό μήνυμα λάθους, "Απαιτείται ηλεκτρονικό ταχυδρομείο", θα εμφανιστεί εάν ένα σώμα αιτήματος δεν περιέχει ένα ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ ιδιοκτησία. Τέλος, χρησιμοποιώντας την προσαρμοσμένη επικύρωση mongoose, το επικυρωτή ιδιοκτησιες αναφορες το isEmail λειτουργία. Αυτή η συνάρτηση επιστρέφει true ή false με βάση την εγκυρότητα της συμβολοσειράς ως email. Στη συνέχεια, η ιδιότητα μηνύματος παίρνει την τιμή email (στηρίγματα) και δημιουργεί ένα σημαντικό μήνυμα σφάλματος.

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

Η τελική γραμμή δημιουργεί και εξάγει ένα μοντέλο μαγκούστας καλώντας το μοντέλο μέθοδος για μαγκούστα. Περάστε το όνομα μοντέλου (Χρήστης) ως πρώτο όρισμα και σχήμα (userSchema) ως δεύτερο επιχείρημα.

Βήμα 4: Εφαρμογή διαδρομών σύνδεσης και εγγραφής

Στον ριζικό κατάλογο του έργου σας, δημιουργήστε ένα διαδρομές ντοσιέ:

Διαδρομές mkdir

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

// routes/userRoutes.js
συνθ εκφράζω = απαιτώ("εξπρές");
συνθ Χρήστης = απαιτώ("../models/userModel");
συνθ bcrypt = απαιτώ("bcrypt");

Δημιουργήστε μια παρουσία δρομολογητή Express καλώντας το Δρομολογητής μέθοδος για εξπρές:

συνθ δρομολογητής = εξπρές. Router();

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

router.post("/sign-up", ασύγχρονος (απαιτ., res) => {
προσπαθήστε {
// Εξαγωγή email και κωδικού πρόσβασης από το αντικείμενο req.body
συνθ { email, password } = req.body;

// Ελεγχοςαν το ηλεκτρονικό ταχυδρομείο είναι ήδη σεχρήση
αφήνω userExists = αναμένω User.findOne({ email });

if (userExists) {
res.status(401).json({ message: "Το email είναι ήδη στο χρήση." });
ΕΠΙΣΤΡΟΦΗ;
}

// Ορισμός γύρους αλατιού
συνθ αλάτιΣτρογγυλά = 10;

// Κατακερματισμός κωδικού πρόσβασης
bcrypt.hash (password, saltRounds, (err, hash) => {
αν (πλανώμαι) βολήνέοςΛάθος("Εσωτερικός διακομιστής Λάθος");

// Δημιουργώ ένα νέοςχρήστης
αφήνω χρήστης = νέος Χρήστης({
ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ,
Κωδικός πρόσβασης: χασίσι,
});

// Αποθήκευση χρήστη στη βάση δεδομένων
user.save().then(() => {
res.json({ μήνυμα: "Ο χρήστης δημιουργήθηκε με επιτυχία", χρήστης });
});
});
} σύλληψη (λάθος) {
ΕΠΙΣΤΡΟΦΗres.κατάσταση(401).στείλετε(πλανώμαι.μήνυμα);
}
});

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

Η αποθήκευση απλών κωδικών πρόσβασης σε μια βάση δεδομένων είναι μια τεράστια απειλή για την ασφάλεια, καθώς κακόβουλοι χάκερ μπορεί να αποκτήσουν πρόσβαση στη βάση δεδομένων. Θα πρέπει να κατακερματίσετε τους κωδικούς πρόσβασης πριν τους αποθηκεύσετε στη βάση δεδομένων σας, επομένως, ακόμα κι αν τους ανακαλύψει ένας χάκερ, δεν θα πρέπει να υπάρχει κίνδυνος για τους χρήστες. Κατακερματισμός είναι η διαδικασία μετατροπής ενός δεδομένου «κλειδιού» σε άλλη τιμή. Ο κατακερματισμός είναι μια μονόδρομη συνάρτηση, που σημαίνει ότι δεν μπορείτε να ανακτήσετε την αρχική τιμή από την hased, σε αντίθεση με την κρυπτογράφηση.

Χρησιμοποιώντας το bcrypt, κατακερματίστηκες τον κωδικό πρόσβασης χρήστη καλώντας τη μέθοδο κατακερματισμού στο bcrypt. Η μέθοδος κατακερματισμού λαμβάνει τρεις παραμέτρους: τη συμβολοσειρά που θα κατακερματιστεί, τους γύρους αλατιού και μια συνάρτηση επανάκλησης. Περνάτε τον κωδικό πρόσβασης χρήστη, τη μεταβλητή saltRounds που δημιουργήσατε νωρίτερα και μια επιστροφή κλήσης.

Οι γύροι αλατιού αναφέρονται στον χρόνο που απαιτείται για τον υπολογισμό ενός μόνο κατακερματισμού bcrypt. Όσο υψηλότεροι είναι οι γύροι αλατιού, τόσο περισσότεροι είναι οι γύροι κατακερματισμού.

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

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

router.post("/sign-in", ασύγχρονος (απαιτ., res) => {
προσπαθήστε {
// Εξαγωγή email και κωδικού πρόσβασης από το αντικείμενο req.body
συνθ { email, password } = req.body;

// Ελεγχοςανχρήστηςυπάρχεισεβάση δεδομένων
αφήνω χρήστης = αναμένω User.findOne({ email });

αν (!χρήστης) {
return res.status (401).json({ message: "Ακυρα διαπιστευτήρια" });
}

// Σύγκριση κωδικών πρόσβασης
bcrypt.compare (password, user.password, (σφάλμα, αποτέλεσμα) => {
αν (αποτέλεσμα) {
return res.status (200).json({ message: "Ο χρήστης συνδέθηκε με επιτυχία" });
}

κονσόλα.log (err);
return res.status (401).json({ message: "Ακυρα διαπιστευτήρια" });
});
} σύλληψη (λάθος) {
res.κατάσταση(401).στείλετε(πλανώμαι.μήνυμα);
}
});

μονάδα μέτρησης.εξαγωγές = δρομολογητής;

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

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

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

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

Η σημασία του ελέγχου ταυτότητας χρήστη

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