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

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

Δημιουργία πίνακα χρηστών

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

ΔΗΜΙΟΥΡΓΩΒΑΣΗ ΔΕΔΟΜΕΝΩΝ nodeapp;

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

ΔΗΜΙΟΥΡΓΩΤΡΑΠΕΖΙχρήστες (
id ΔΗΜΙΟΥΡΓΕΙΤΑΙ ΠΑΝΤΑ ΩΣ ΠΡΩΤΕΙΟ ΚΛΕΙΔΙ ΤΑΥΤΟΤΗΤΑΣ,
email CHAR(128),
κωδικός πρόσβασης CHAR(60)
);

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

instagram viewer

Δημιουργία διακομιστή κόμβου

Το Node.js είναι ένα περιβάλλον χρόνου εκτέλεσης JavaScript από την πλευρά του διακομιστή που μας επιτρέπει να δημιουργούμε διακομιστές HTTP γρήγορα. Για να απλοποιήσετε τη διαδικασία δημιουργίας του διακομιστή και διαφορετικών διαδρομών HTTP, μπορείτε να χρησιμοποιήσετε Express, ένα πλαίσιο ιστού Node.js.

Εκτελέστε αυτήν την εντολή για να δημιουργήσετε έναν νέο φάκελο που ονομάζεται postgres-auth:

mkdir postgres-auth

Στη συνέχεια, αρχικοποιήστε το npm:

npm init -y

Τέλος, εγκαταστήστε το Express:

npm εγκατάσταση express

Μπορείς τώρα δημιουργήστε τον διακομιστή web Node.

Σε ένα νέο αρχείο που ονομάζεται index.js, προσθέστε τα ακόλουθα:

συνθ εκφράζω = απαιτώ("εξπρές");
συνθ app = express();
app.use (express.json());
app.use (express.urlencoded({ επεκτάθηκε: αληθής }));
app.listen(3000, () => κονσόλα.log("Listening on port 3000"));

Με την εκτέλεση αυτού του κώδικα θα ξεκινήσει ο διακομιστής και θα καταγραφούν τα ακόλουθα στην κονσόλα:

Ακρόαση στη θύρα 3000

Σύνδεση με PostgreSQL

Προς την συνδεθείτε στο PostgreSQL χρήση κόμβος-postgres. Το node-postgres είναι ένα πρόγραμμα οδήγησης σύνδεσης που παρέχει μια διεπαφή μεταξύ του Node και του Postgres.

Εκτελέστε τα ακόλουθα για να εγκαταστήσετε τα node-postrges μέσω npm:

npm εγκατάσταση σελ

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

συνθ { Πελάτης } = απαιτώ("σελ.");
συνθ { χρήστης, κεντρικός υπολογιστής, βάση δεδομένων, κωδικός πρόσβασης, θύρα } = απαιτώ("./dbConfig");

συνθ πελάτης = νέος Πελάτης({
χρήστης,
πλήθος,
βάση δεδομένων,
Κωδικός πρόσβασης,
Λιμάνι,
});

client.connect();
μονάδα μέτρησης.εξαγωγές = πελάτης;

Η μέθοδος πελάτη από το node-postgres λαμβάνει τις λεπτομέρειες της βάσης δεδομένων στην οποία συνδέεστε. Αυτό το πρόγραμμα εισάγει τις λεπτομέρειες σύνδεσής του από ένα αρχείο που ονομάζεται dbConfig. Επομένως, δημιουργήστε αυτό το αρχείο και προσθέστε τον ακόλουθο κώδικα σε αυτό:

μονάδα μέτρησης.εξαγωγές = {
χρήστης: "postgres",
οικοδεσπότης: "localhost",
βάση δεδομένων: "nodeapp",
κωδικός πρόσβασης: "yourPassword",
Λιμάνι: 5432,
};

Δημιουργία βοηθητικών λειτουργιών βάσης δεδομένων

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

  1. Για να ελέγξετε αν το email είναι ήδη καταχωρημένο.
  2. Για να δημιουργήσετε τον χρήστη.

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

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

συνθ πελάτης = απαιτώ("./db.js")

Στη συνέχεια, προσθέστε μια νέα συνάρτηση που ονομάζεται emailExists():

συνθ emailΥπάρχει = ασυγχρονισμός (email) => {
συνθ δεδομένα = αναμένω client.query("SELECT * FROM users WHERE email=$1", [
ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ,
]);

αν (data.rowCount == 0) ΕΠΙΣΤΡΟΦΗψευδής;
ΕΠΙΣΤΡΟΦΗ data.rows[0];
};

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

Για να δημιουργήσετε μια συνάρτηση που δημιουργεί τον χρήστη, προσθέστε μια συνάρτηση που ονομάζεται createUser() στο helper.js:

συνθ createUser = ασυγχρονισμός (email, κωδικός πρόσβασης) => {
συνθ αλάτι = αναμένω bcrypt.genSalt(10);
συνθ κατακερματισμός = αναμένω bcrypt.hash (κωδικός πρόσβασης, αλάτι);

συνθ δεδομένα = αναμένω client.query(
"INSERT INTO users (email, password) VALUES ($1, $2) ΕΠΙΣΤΡΟΦΗ ταυτότητα, email, κωδικός πρόσβασης",
[email, κατακερματισμός]
);

αν (data.rowCount == 0) ΕΠΙΣΤΡΟΦΗψευδής;
ΕΠΙΣΤΡΟΦΗ data.rows[0];
};

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

Εγκαταστήστε το bcryptjs για να αρχίσετε να το χρησιμοποιείτε:

npm εγκατάσταση bcryptjs

Στο helper.js, εισαγάγετε bcryptjs:

συνθ bcrypt = απαιτώ("bcryptjs")

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

Δημιουργήστε μια συνάρτηση που ονομάζεται matchPassword():

συνθ matchPassword = ασυγχρονισμός (password, hashPassword) => {
συνθ ταίριασμα = αναμένω bcrypt.compare (password, hashPassword);
ΕΠΙΣΤΡΟΦΗ αγώνας
};

Λαμβάνει τον απλό κωδικό πρόσβασης και τον κατακερματισμό και στη συνέχεια χρησιμοποιεί την Bcrypt.compare() για να προσδιορίσει εάν ο κωδικός που παρέχεται είναι σωστός. Αν είναι, επιστρέφει true διαφορετικά, επιστρέφει false.

Αυτές είναι όλες οι λειτουργίες που θα χρησιμοποιήσουμε για να αλληλεπιδράσουμε με τη βάση δεδομένων. Φροντίστε να τα εξάγετε όλα στο τέλος:

μονάδα μέτρησης.exports = { emailExists, createUser, matchPassword };

Διαμόρφωση διαβατηρίου

Το Passport είναι ένα ενδιάμεσο λογισμικό ελέγχου ταυτότητας Node που παρέχει περισσότερες από 500 στρατηγικές ελέγχου ταυτότητας, όπως η σύνδεση μέσω κοινωνικής δικτύωσης, τα JSON Web Tokens (JWT) και ο έλεγχος ταυτότητας email. Θα χρησιμοποιήσουμε το τελευταίο που προβλέπει η στρατηγική διαβατηρίου-τοπική.

Χρησιμοποιήστε την ακόλουθη εντολή για να εγκαταστήσετε το passport και το passport-local:

npm εγκατάσταση διαβατηρίου
npm εγκατάσταση διαβατηρίου-τοπικό

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

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

συνθ Τοπική Στρατηγική = απαιτώ("διαβατήριο-τοπικό");
συνθ { emailExists, createUser, matchPassword } = απαιτώ("./βοηθός");

Στο ίδιο αρχείο προσθέστε τα εξής για να ρυθμίσετε την εγγραφή χρήστη:

μονάδα μέτρησης.exports = (διαβατήριο) => {
passport.use(
"τοπική εγγραφή",
νέος ΤοπικήΣτρατηγική(
{
usernameField: "email",
Πεδίο κωδικού πρόσβασης: "password",
},
ασυγχρονισμός (email, κωδικός πρόσβασης, έτοιμο) => {
προσπαθήστε {
συνθ userExists = αναμένω emailΥπάρχει (email)

αν (userExists) {
ΕΠΙΣΤΡΟΦΗ Ολοκληρώθηκε(μηδενικό, ψευδής);
}

συνθ χρήστης = αναμένω createUser (email, κωδικός πρόσβασης);
ΕΠΙΣΤΡΟΦΗ Ολοκληρώθηκε(μηδενικό, χρήστης);
} σύλληψη (λάθος) {
έγινε (σφάλμα)?
}
}
)
);
}

Εφόσον το passport-local αναμένει ένα όνομα χρήστη και έναν κωδικό πρόσβασης και χρησιμοποιείτε ένα email, ορίστε το πεδίο ονόματος χρήστη σε ένα email. Ο χρήστης ή μάλλον το frontend τμήμα αυτής της εφαρμογής θα στείλει το email και τον κωδικό πρόσβασης στο σώμα του αιτήματος. Ωστόσο, δεν χρειάζεται να εξαγάγετε τις τιμές μόνοι σας, καθώς το Passport θα το χειριστεί στο παρασκήνιο.

Αυτό το πρόγραμμα ελέγχει πρώτα αν το email έχει ήδη ληφθεί χρησιμοποιώντας τη συνάρτηση emailExists() από το helper.js. Εάν το email δεν υπάρχει στη βάση δεδομένων, δημιουργεί έναν νέο χρήστη με τη συνάρτηση createUser(). Τέλος, επιστρέφει το αντικείμενο χρήστη.

Για να συνδεθείτε χρήστες, προσθέστε τα ακόλουθα στο passportConfig.js:

μονάδα μέτρησης.exports = (διαβατήριο) => {
passport.use(
"τοπική εγγραφή",
νέος ΤοπικήΣτρατηγική(
// Εγγραφείτε
)
);
passport.use(
"τοπική σύνδεση",
νέος ΤοπικήΣτρατηγική(
{
usernameField: "email",
Πεδίο κωδικού πρόσβασης: "password",
},
ασυγχρονισμός (email, κωδικός πρόσβασης, έτοιμο) => {
προσπαθήστε {
συνθ χρήστης = αναμένω emailΥπάρχει (email);
αν (!χρήστης) ΕΠΙΣΤΡΟΦΗ Ολοκληρώθηκε(μηδενικό, ψευδής);
συνθ isMatch = αναμένω matchPassword (password, user.password);
αν (!isMatch) ΕΠΙΣΤΡΟΦΗ Ολοκληρώθηκε(μηδενικό, ψευδής);
ΕΠΙΣΤΡΟΦΗ Ολοκληρώθηκε(μηδενικό, {ταυτότητα: ταυτότητα χρήστη, ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ: user.email});
} σύλληψη (λάθος) {
ΕΠΙΣΤΡΟΦΗ έγινε (λάθος, ψευδής);
}
}
)
);
};

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

Το τελευταίο βήμα είναι να δημιουργήσετε τα τελικά σημεία του API:

  • POST /auth/signup
  • POST /auth/login

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

Εισαγάγετε και ρυθμίστε το Passport σε ένα νέο αρχείο με το όνομα server.js:

συνθ διαβατήριο = απαιτώ("διαβατήριο");
απαιτώ("./passportConfig")(passport);

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

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

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

Ελέγξτε το API σας χρησιμοποιώντας δοκιμές μονάδας

Μπορείτε να χρησιμοποιήσετε το Passport για τον έλεγχο ταυτότητας μιας εφαρμογής Node χρησιμοποιώντας μια εφαρμογή PostgreSQL. Δημιουργήσατε τελικά σημεία API για να εγγραφείτε και να συνδεθείτε στους χρήστες.

Ενώ μπορείτε να χρησιμοποιήσετε προγράμματα-πελάτες REST όπως ο Postman για να ελέγξετε πόσο καλά λειτουργεί ένα API, η σύνταξη δοκιμών μονάδας είναι πολύ πιο απλή. Οι δοκιμές μονάδας σάς επιτρέπουν να δοκιμάσετε τα μεμονωμένα μέρη της εφαρμογής σας. Με αυτόν τον τρόπο, ακόμα κι αν ένα τελικό σημείο αποτύχει, μπορείτε να εντοπίσετε το ακριβές σημείο αποτυχίας. Ένα από τα εργαλεία που μπορείτε να χρησιμοποιήσετε για να δοκιμάσετε εφαρμογές Node είναι το Jest.