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

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

Τα ORM Node.js, όπως το Sequelize και το TypeORM, σας επιτρέπουν να ορίσετε κανόνες επικύρωσης εκτός πλαισίου σε επίπεδο εφαρμογής. Κατά την ανάπτυξη του API, τα δεδομένα προέρχονται από αιτήματα HTTP σε συγκεκριμένα τελικά σημεία. Αυτό συμβαίνει σε επίπεδο αιτήματος. Επομένως, η προεπιλεγμένη επικύρωση που προσφέρεται από τα ORM δεν ισχύει για αυτά.

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

Ρύθμιση έργου επίδειξης

Για να δείξουμε πώς Joi επικυρώνει δεδομένα, θα δημιουργήσετε μια απλή εφαρμογή επίδειξης που μιμείται μια πραγματική εφαρμογή.

instagram viewer

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

mkdir demoapp && cd demoapp

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

npm init -y

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

  • Εξπρές: Το Express είναι ένα πλαίσιο Node.js που παρέχει ένα ισχυρό σύνολο δυνατοτήτων για εφαρμογές ιστού και κινητών. Το Express διευκολύνει τη δημιουργία εφαρμογών υποστήριξης με το Node.js.
  • Joi: Το Joi είναι μια βιβλιοθήκη επικύρωσης δεδομένων για το Node.js.

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

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

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

συνθ εκφράζω = απαιτώ("εξπρές");
συνθ δρομολογητής = απαιτώ("./διαδρομές");
συνθ λιμάνι = 3000;

συνθ app = express();

app.use (express.json());
app.use (express.urlencoded({ επεκτάθηκε: αληθής }));
app.use (δρομολογητής);

app.listen (port, () => {
κονσόλα.κούτσουρο("Ακρόαση εφαρμογής στη θύρα 3000!");
});

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

Δρομολόγηση και χειρισμός αιτημάτων

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

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

συνθ demoHandler = (req, res, επόμενο) => {
res.send({
κώδικας: 201,
δεδομένα: req.body,
});
Επόμενο();
};

μονάδα μέτρησης.exports = demoHandler;

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

συνθ εκφράζω = απαιτώ("εξπρές");
συνθ demoHandler = απαιτώ("./handler");
συνθ δρομολογητής = εξπρές. Router();

router.post("/Εγγραφείτε", demoHandler);

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

Δημιουργία σχήματος Joi

Ένα σχήμα Joi αντιπροσωπεύει την αναμενόμενη δομή και τους κανόνες επικύρωσης ενός συγκεκριμένου αντικειμένου δεδομένων.

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

Για παράδειγμα:

συνθ exampleSchema = Joi.object({
όνομα: Joi.string().min(3).απαιτείται(),
});

Το παραπάνω παράδειγμα περιγράφει ένα απλό σχήμα Joi με a όνομα ιδιοκτησία. ο όνομα το ακίνητο έχει αξία Joi.string().min (3).required(). Αυτό σημαίνει ότι το όνομα Η τιμή πρέπει να είναι μια συμβολοσειρά, με ελάχιστο μήκος 3 χαρακτήρων και απαιτείται.

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

Ακολουθεί ένα παράδειγμα με περισσότερα πεδία και περιορισμούς επικύρωσης:

συνθ userSchema = Joi.object({
email: Joi.string().email().required(),

κωδικός πρόσβασης: Joi.string().min(6).απαιτείται(),

ηλικία: Joi.number().min(18).προαιρετικός(),

που χρησιμοποιείται: Joi.boolean().optional(),

τηλέφωνο: Joi.string()
.regex(/^\\d{3}-\\d{3}-\\d{4}$/)//"123-456-7890"
.απαιτείται(),

διεύθυνση: Joi.object({
οδός: Joi.string().min(3).απαιτείται(),
πόλη: Joi.string().min(3).απαιτείται(),
κατάσταση: Joi.string().min(3).απαιτείται(),
zip: Joi.number().min(3).απαιτείται(),
}).απαιτείται(),

 χόμπι: Joi.array().items (Joi.string()).required(),

}).επιλογές({ αποβολή νωρίς: ψευδής });

ο userSchema ορίζει τους ακόλουθους περιορισμούς για κάθε ιδιότητα:

  • ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ: Πρέπει να είναι έγκυρη συμβολοσειρά email.
  • Κωδικός πρόσβασης: Πρέπει να είναι μια συμβολοσειρά με τουλάχιστον 6 χαρακτήρες.
  • ηλικία: Ένας προαιρετικός αριθμός με ελάχιστη τιμή το 18.
  • απασχολούνται: Ένα προαιρετικό boolean.
  • τηλέφωνο: Μια απαιτούμενη συμβολοσειρά που ταιριάζει με την καθορισμένη έκφραση regex (/^\d{3}-\d{3}-\d{4}$/).
  • διεύθυνση: Ένα αντικείμενο που αντιπροσωπεύει τη διεύθυνση του χρήστη με τις ακόλουθες δευτερεύουσες ιδιότητες.
    • δρόμος: Απαιτούμενη συμβολοσειρά με ελάχιστο μήκος 3 χαρακτήρων.
    • πόλη: Απαιτούμενη συμβολοσειρά με ελάχιστο μήκος 3 χαρακτήρων.
    • κατάσταση: Απαιτούμενη συμβολοσειρά με ελάχιστο μήκος 3 χαρακτήρων.
    • φερμουάρ: Απαιτούμενος αριθμός με ελάχιστη τιμή 3.
  • χόμπι: Απαιτούμενος πίνακας συμβολοσειρών.

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

Επικύρωση δεδομένων με Joi

Δημιουργώ ένα επικύρωση.js αρχείο και προσθέστε το userSchema κωδικός σε αυτό.

Όπως έτσι:

//validation.js
συνθ Joi = απαιτώ("χαρά");

συνθ userSchema = Joi.object({
//...
}).επιλογές({ αποβολή νωρίς: ψευδής });

μονάδα μέτρησης.exports = userSchema;

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

συνθ επικύρωσηMiddleware = (σχήμα) => {
ΕΠΙΣΤΡΟΦΗ(req, res, επόμενο) => {
συνθ { error } = schema.validate (req.body);

αν (λάθος) {
// Χειρισμός σφάλματος επικύρωσης
κονσόλα.log (error.message);

res.status(400).json({ Σφάλματα: λεπτομέρειες σφάλματος });
} αλλού {
// Τα δεδομένα είναι έγκυρα, προχωρήστε στο επόμενο ενδιάμεσο λογισμικό
Επόμενο();
}
};
};

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

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

Τέλος, εξάγετε το επικύρωσηMiddleware και userSchema.

μονάδα μέτρησης.εξαγωγές = {
userSchema,
επικύρωσηMiddleware,
};

Περιορισμοί επικύρωσης δοκιμής

Εισαγωγή επικύρωσηMiddleware και userSchema στο δικό σου router.js αρχείο και ρυθμίστε το ενδιάμεσο λογισμικό ως εξής:

συνθ { validationMiddleware, userSchema } = απαιτώ("./επικύρωση");

router.post("/Εγγραφείτε", validationMiddleware (userSchema), demoHandler);

Ξεκινήστε την εφαρμογή σας εκτελώντας την παρακάτω εντολή:

κόμβοςδείκτης.js

Στη συνέχεια, κάντε ένα αίτημα HTTP POST σε localhost: 3000/εγγραφή χρησιμοποιώντας τα παρακάτω δεδομένα δοκιμής. Μπορείτε να το επιτύχετε χρησιμοποιώντας το cURL ή οποιοδήποτε άλλο πρόγραμμα-πελάτη API.

{
"ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ": "user@example", // Μη έγκυρη μορφή email
"Κωδικός πρόσβασης": "πέρασμα", // Μήκος κωδικού πρόσβασης μικρότερο από 6 χαρακτήρες
"ηλικία": 15, // Ηλικία κάτω των 18 ετών
"απασχολούμενος": αληθής,
"χόμπι": ["ΑΝΑΓΝΩΣΗ", "τρέξιμο"],
"τηλέφωνο": "123-456-789", // Μη έγκυρη μορφή αριθμού τηλεφώνου
"διεύθυνση": {
"δρόμος": "123",
"πόλη": "Πόλη παράδειγμα",
"κατάσταση": "Παράδειγμα Πολιτείας",
"φερμουάρ": 12345
}
}

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

Απλοποίηση της επικύρωσης δεδομένων με το Joi

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

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