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

Σε αυτό το σεμινάριο, θα μάθετε πώς να εφαρμόζετε τον έλεγχο ταυτότητας στο Node χρησιμοποιώντας το Passport και το MongoDB.

Τι είναι ο έλεγχος ταυτότητας και η εξουσιοδότηση;

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

Τι είναι το Passport.js;

Passport.js (ή Passport) είναι ένα ενδιάμεσο λογισμικό ελέγχου ταυτότητας για το NodeJS που παρέχει περισσότερες από 500 στρατηγικές για τον έλεγχο ταυτότητας των χρηστών, συμπεριλαμβανομένων

διαβατήριο-τοπικό που χρησιμοποιεί όνομα χρήστη και κωδικό πρόσβασης.

Αυτό το σεμινάριο χρησιμοποιεί διαβατήριο-τοπικό και διαβατήριο-jwt για την εξασφάλιση των διαδρομών.

Πώς να ρυθμίσετε τον έλεγχο ταυτότητας χρήστη στο NodeJS

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

Βήμα 1: Ρύθμιση ενός διακομιστή κόμβου

Δημιουργήστε ένα φάκελο με όνομα user-auth-nodejs και πλοηγηθείτε σε αυτό χρησιμοποιώντας το τερματικό σας.

mkdir user-auth-nodejs. 

cd user-auth-nodejs

Επόμενη προετοιμασία πακέτο.json.

npm init

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

npm εκφράζω

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

const express = απαιτώ ("express");
const app = express();
const PORT = 3000;
app.listen (PORT, () => {
console.log(`Ακρόαση στη θύρα ${PORT}`);
});

Σχετιζομαι με: Μάθετε πώς να εγκαταστήσετε τα Npm και Node.js στο Ubuntu

Βήμα 2: Ρύθμιση της βάσης δεδομένων

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

Εγκαταστήστε το mongoose.

npm i mongoose

Δημιουργήστε ένα νέο αρχείο, userModel.jsκαι προσθέστε τα ακόλουθα.

const mongoose = απαιτώ ('μαγκούστα')
const {Σχήμα} = μαγκούστα
const UserSchema = νέο σχήμα ({
ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ: {
τύπος: String,
απαιτείται: αληθής
},
Κωδικός πρόσβασης: {
τύπος: String,
απαιτείται: αληθής
}
})
const UserModel = mongoose.model('user', UserSchema);
module.exports = UserModel;

Σχετιζομαι με: Πώς να δημιουργήσετε μια βάση δεδομένων και μια συλλογή στο MongoDB

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

Εγκαθιστώ bcryptjs.

npm και bcryptjs

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

const mongoose = απαιτώ ('μαγκούστα')
const bcrypt = απαιτείται('bcryptjs');
const {Σχήμα} = μαγκούστα

const UserSchema = νέο σχήμα ({
...
})
UserSchema.pre('save', async function (επόμενο) {
προσπαθήστε {
// ελέγξτε τη μέθοδο εγγραφής
const user = αυτό;
if (!user.isModified('password')) next();
// παράγουν αλάτι
const salt = αναμονή bcrypt.genSalt (10);
// κατακερματίστε τον κωδικό πρόσβασης
const hashedPassword = αναμονή bcrypt.hash (this.password, salt);
// αντικαταστήστε τον κωδικό πρόσβασης απλού κειμένου με κατακερματισμένο κωδικό πρόσβασης
this.password = hashedPassword;
Επόμενο();
} catch (σφάλμα) {
επιστροφή επόμενο (σφάλμα).
}
});
...
const User = mongoose.model('User', UserSchema);

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

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

Δημιουργήστε db.js και ρυθμίστε τις παραμέτρους της βάσης δεδομένων.

const mongoose = απαιτώ ("μαγκούστα");
μαγκούστα. Υπόσχεση = παγκόσμια. Υπόσχεση;
const dbUrl = "mongodb://localhost/user";
const connect = async () => {
mongoose.connect (dbUrl, { useNewUrlParser: true, useUnifiedTopology: true });
const db = μαγκούστα.σύνδεση;
db.on("σφάλμα", () => {
console.log("δεν ήταν δυνατή η σύνδεση");
});
db.once("open", () => {
console.log("> Επιτυχής σύνδεση με τη βάση δεδομένων");
});
};
module.exports = { connect };

Στο app.js, συνδεθείτε στη βάση δεδομένων.

// σύνδεση σε db
const db = απαιτούν('./db');
db.connect();

Βήμα 3: Ρύθμιση διαβατηρίου

Εγκαθιστώ Διαβατήριο και διαβατήριο-τοπικό. Θα χρησιμοποιήσετε αυτά τα πακέτα για την εγγραφή και τη σύνδεση χρηστών.

npm i διαβατήριο
npm i διαβατήριο-τοπικό

Δημιουργήστε ένα νέο αρχείο, passportConfig.js, και εισαγωγή διαβατήριο-τοπικό και το userModel.js.

const LocalStraregy = απαιτείται ("passport-local").Strategy;
const Χρήστης = Απαιτείται("./userModel");

Διαμορφώστε το Passport για να χειριστείτε την εγγραφή χρήστη.

const LocalStrategy = απαιτείται ("passport-local");
const Χρήστης = Απαιτείται("./userModel");
module.exports = (διαβατήριο) => {
passport.use(
"τοπική εγγραφή",
νέα τοπική στρατηγική(
{
usernameField: "email",
Πεδίο κωδικού πρόσβασης: "password",
},
ασυγχρονισμός (email, κωδικός πρόσβασης, ολοκληρωμένο) => {
προσπαθήστε {
// ελέγξτε εάν υπάρχει χρήστης
const userExists = await User.findOne({ "email": email });
if (userExists) {
η επιστροφή έγινε (μηδενική, ψευδής)
}
// Δημιουργία νέου χρήστη με τα δεδομένα χρήστη που παρέχονται
const user = await User.create({ email, password });
η επιστροφή έγινε (μηδενική, χρήστης).
} catch (σφάλμα) {
έγινε (λάθος).
}
}
)
);
}

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

Χρήση διαβατήριο-τοπικό για να χειριστεί επίσης τη σύνδεση χρήστη.

module.exports = (διαβατήριο) => {
passport.use(
"τοπική εγγραφή",
νέα τοπική στρατηγική(
...
)
);
passport.use(
"τοπική σύνδεση",
νέα τοπική στρατηγική(
{
usernameField: "email",
Πεδίο κωδικού πρόσβασης: "password",
},
ασυγχρονισμός (email, κωδικός πρόσβασης, ολοκληρωμένο) => {
προσπαθήστε {
const user = await User.findOne({ email: email });
εάν (!χρήστης) επιστρέψει γίνει (null, false);
const isMatch = await user.matchPassword (password);
αν (!isMatch)
η επιστροφή έγινε (μηδενική, ψευδής).
// εάν οι κωδικοί πρόσβασης ταιριάζουν με τον χρήστη επιστροφής
η επιστροφή έγινε (μηδενική, χρήστης).
} catch (σφάλμα) {
console.log (σφάλμα)
η επιστροφή έγινε (λάθος, ψευδής).
}
}
)
);
};

Εδώ, ελέγξτε εάν ο χρήστης υπάρχει στη βάση δεδομένων και εάν υπάρχει, ελέγξτε εάν ο κωδικός που παρέχεται ταιριάζει με αυτόν στη βάση δεδομένων. Σημειώστε ότι καλείτε επίσης το matchPassword() μέθοδο στο μοντέλο χρήστη, οπότε μεταβείτε στο userModel.js αρχείο και προσθέστε το.

UserSchema.methods.matchPassword = ασύγχρονη συνάρτηση (κωδικός πρόσβασης) {
προσπαθήστε {
επιστροφή σε αναμονή bcrypt.compare (password, this.password);
} catch (σφάλμα) {
ρίχνει νέο Σφάλμα (σφάλμα)?
}
};

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

Βήμα 4: Ρυθμίστε τις διαδρομές ελέγχου ταυτότητας

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

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

app.post(
 "/auth/signup",
passport.authenticate('local-signup', { session: false }),
(απαιτ., ανταπόκριση, επόμενο) => {
// Εγγραφείτε
res.json({
χρήστης: req.user,
});
}
);

Σχετιζομαι με: Έλεγχος ταυτότητας vs. Εξουσιοδότηση: Ποια είναι η διαφορά;

Εάν είναι επιτυχής, η διαδρομή εγγραφής θα πρέπει να επιστρέψει τον χρήστη που δημιουργήθηκε.

Στη συνέχεια, δημιουργήστε τη διαδρομή σύνδεσης.

app.post(
"/auth/login",
passport.authenticate('local-login', { session: false }),
(απαιτ., ανταπόκριση, επόμενο) => {
// Σύνδεση
res.json({
χρήστης: req.user,
});
}
);

Βήμα 5: Προσθήκη Προστατευμένων Διαδρομών

Μέχρι στιγμής, έχετε χρησιμοποιήσει Διαβατήριο για να δημιουργήσετε ένα ενδιάμεσο λογισμικό που καταχωρεί έναν χρήστη στη βάση δεδομένων και ένα άλλο που επιτρέπει σε έναν εγγεγραμμένο χρήστη να εισέλθει. Στη συνέχεια, θα δημιουργήσετε ένα ενδιάμεσο λογισμικό εξουσιοδότησης για την προστασία ευαίσθητων διαδρομών χρησιμοποιώντας ένα διακριτικό ιστού JSON (JWT). Για να εφαρμόσετε την εξουσιοδότηση JWT, πρέπει:

  • Δημιουργήστε διακριτικό JWT.
  • Δώστε το διακριτικό στον χρήστη. Ο χρήστης θα το στείλει πίσω σε αιτήματα εξουσιοδότησης.
  • Επαληθεύστε το διακριτικό που έστειλε πίσω ο χρήστης.

Θα χρησιμοποιήσετε το jsonwebtoken πακέτο για το χειρισμό JWT.

Εκτελέστε την παρακάτω εντολή για να το εγκαταστήσετε.

npm και jsonwebtoken

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

Σε app.js, εισαγωγή jsonwebtoken και τροποποιήστε τη διαδρομή σύνδεσης όπως παρακάτω.

app.post(
"/auth/login",
passport.authenticate('local-login', { session: false }),
(απαιτ., ανταπόκριση, επόμενο) => {
// Σύνδεση
jwt.sign({user: req.user}, 'secretKey', {expiresIn: '1h'}, (err, token) => {
αν (λάθος) {
επιστροφή res.json({
μήνυμα: "Απέτυχε η σύνδεση",
διακριτικό: μηδενικό,
});
}
res.json({
ένδειξη
});
})
}
);

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

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

Χρήση διαβατήριο-jwt για πρόσβαση σε προστατευμένες διαδρομές.

npm i passport-jwt

Σε passportConfig.js, διαμορφώστε το διαβατήριο-jwt.

const JwtStrategy = απαιτείται("passport-jwt").Strategy;
const { ExtractJwt } = απαιτείται ("passport-jwt")
module.exports = (διαβατήριο) => {
passport.use(
"τοπική σύνδεση",
νέα τοπική στρατηγική(
...
);
passport.use(
νέα στρατηγική Jwt(
{
jwtFromRequest: ExtractJwt.fromHeader("εξουσιοδότηση"),
secretOrKey: "secretKey",
},
async (jwtPayload, ολοκληρωμένο) => {
προσπαθήστε {
// Εξαγωγή χρήστη
const user = jwtPayload.user;
έγινε (μηδενικό, χρήστης)
} catch (σφάλμα) {
έγινε (λάθος, λάθος)
}
}
)
);
};

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

Για να δούμε πώς διαβατήριο-jwt φύλακες διαδρομές, δημιουργήστε μια προστατευμένη διαδρομή μέσα app.js.

app.get(
"/user/protected",
passport.authenticate("jwt", { session: false }),
(απαιτ., ανταπόκριση, επόμενο) => {
res.json({user: req.user});
}
);

Μόνο ένα αίτημα με έγκυρο JWT επιστρέφει τα δεδομένα χρήστη.

Τώρα είστε έτοιμοι να μεταφέρετε τον έλεγχο ταυτότητας χρήστη στο επόμενο επίπεδο

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

Τι είναι ο έλεγχος ταυτότητας χρήστη και πώς λειτουργεί;

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

Διαβάστε Επόμενο

ΜερίδιοΤιτίβισμαΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ
Σχετικά θέματα
  • Προγραμματισμός
  • Προγραμματισμός
  • Γλώσσες προγραμματισμού
  • Εργαλεία Προγραμματισμού
Σχετικά με τον Συγγραφέα
Μαίρη Γαθώνη (Δημοσιεύτηκαν 8 άρθρα)

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

Περισσότερα από τη Μαίρη Γαθώνη

Εγγραφείτε στο ενημερωτικό μας δελτίο

Εγγραφείτε στο ενημερωτικό μας δελτίο για συμβουλές τεχνολογίας, κριτικές, δωρεάν ebook και αποκλειστικές προσφορές!

Κάντε κλικ εδώ για να εγγραφείτε