Aperçu du contenu
Cet article développe un didacticiel précédent couvrant la création de base d'API CRUD avec Express.js, en se concentrant sur les aspects de sécurité cruciaux : validation, authentification et autorisation. Nous nous appuierons sur l'exemple précédent, il est donc recommandé de se familiariser avec ce matériel. Le projet complet est disponible sur GitHub (lien fourni ci-dessous).
Concepts clés
Validation : Garantir que les données fournies par l'utilisateur sont conformes aux règles et normes prédéfinies. Ceci est primordial pour la sécurité, car il évite les vulnérabilités telles que l’injection SQL. Plusieurs ressources soulignent l'importance d'une validation robuste (liens fournis ci-dessous).
Authentification : Vérification de l'identité d'un utilisateur. Cela implique généralement de vérifier les informations d'identification (par exemple, nom d'utilisateur/e-mail et mot de passe) par rapport aux enregistrements stockés.
Autorisation : Déterminer les actions qu'un utilisateur est autorisé à effectuer. Cela contrôle l'accès aux ressources en fonction des rôles et des autorisations des utilisateurs.
Mise en œuvre de la validation
Nous allons créer des fonctions de validation pour les champs name
, amount
et date
:
name
: Chaîne, non vide, 10 à 255 caractères.amount
: Nombre ou chaîne numérique, positif, non vide.date
: Chaîne, facultatif (par défaut, la date actuelle si elle est omise), format AAAA-MM-JJ.Ces fonctions (situées dans validations.js
) utilisent la vérification de type et la validation de format de base. Une validation plus complète (par exemple, des vérifications de plages de dates) pourrait être ajoutée.
<code class="language-javascript">// validations.js (excerpt) const isString = (arg) => typeof arg === "string"; const isNumber = (arg) => !isNaN(Number(arg)); function isValidName(name) { /* ... */ } function isValidAmount(amount) { /* ... */ } function isValidDate(date) { /* ... */ } module.exports = { isValidName, isValidAmount, isValidDate };</code>
Ajout d'une authentification et d'une autorisation
Pour la démonstration, nous utiliserons le stockage de données en mémoire (un tableau d'objets) pour les utilisateurs et les dépenses. Ce n'est pas adapté à la production.
Le fichier data.js
stocke les données des utilisateurs et des dépenses :
<code class="language-javascript">// data.js (excerpt) let users = [ { id: "...", email: "...", password: "..." }, //Example User // ...more users ]; let expenditures = [ { id: "...", userId: "...", name: "...", amount: ..., date: "..." }, //Example Expense // ...more expenses ]; module.exports = { expenditures, users };</code>
Point de terminaison d'inscription (/users/signup
)
Ce point de terminaison crée de nouveaux utilisateurs. Il valide l'e-mail et le mot de passe, vérifie les doublons d'e-mails, génère un UUID et (pour cette démo uniquement) stocke le mot de passe brut. Un jeton d'authentification codé en base64 (email:UUID) est renvoyé. Le hachage du mot de passe est omis par souci de simplicité mais est crucial dans un environnement de production.
Point de terminaison de connexion (/users/login
)
Ce point de terminaison authentifie les utilisateurs existants. Il valide les informations d'identification et renvoie un jeton d'authentification codé en base64 en cas de succès.
Points de terminaison protégés
Pour protéger les points de terminaison (par exemple, /expenditures
), nous aurons besoin d'un jeton d'authentification dans les en-têtes de requête (Authorization
en-tête). Le jeton est décodé, l'utilisateur est vérifié et seules les propres données de l'utilisateur sont renvoyées.
<code class="language-javascript">// validations.js (excerpt) const isString = (arg) => typeof arg === "string"; const isNumber = (arg) => !isNaN(Number(arg)); function isValidName(name) { /* ... */ } function isValidAmount(amount) { /* ... */ } function isValidDate(date) { /* ... */ } module.exports = { isValidName, isValidAmount, isValidDate };</code>
Conclusion
Cet article fournit une introduction de base à la validation, à l'authentification et à l'autorisation dans une API Node.js/Express.js. N'oubliez pas que les mesures de sécurité présentées ici sont simplifiées à des fins pédagogiques et ne doivent pas être utilisées dans les systèmes de production. Les applications prêtes pour la production nécessitent un hachage de mot de passe robuste, une gestion sécurisée des jetons (les JWT sont recommandés) et une intégration de base de données.
Ressources
(N'oubliez pas de remplacer les espaces réservés entre crochets par des liens réels.)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!