L'authentification de l'API est l'un des plus grands défis lors de la construction d'une API et l'une des plus grandes vulnérabilités de sécurité de l'API. Le bon mécanisme d'authentification aide à éviter les menaces de sécurité et garantit que seuls les utilisateurs autorisés peuvent accéder aux données requises.
L'authentification était autrefois simple lors de la gestion des applications côté serveur. Une vérification simple de session sur le serveur est suffisante pour garantir les autorisations de l'utilisateur à l'opération. Cependant, l'avènement des API a apporté des changements importants à ces défis d'authentification.
Cependant, pour les API, vous ne pouvez pas implémenter une session. Vous ne pouvez pas garantir que votre API est toujours appelée à l'aide d'un navigateur Web, vous ne pouvez donc pas compter sur des cookies pour protéger votre API. L'une des principales caractéristiques d'une API est son apatritude, ce qui signifie que chaque demande envoyée à l'API ne dépend pas d'aucune demande précédente ou ultérieure. Par conséquent, vous avez besoin d'un moyen de transporter les informations d'authentification / autorisation requises pour les demandes de vérification.
Une technique d'authentification API efficace consiste à utiliser JSON Web Token (JWT). Dans cet article, nous creuserons dans les détails de JWT et fournirons un guide complet sur la façon de mettre en œuvre l'API REST à l'aide de Node.js, JWT comme mesure de sécurité.
Points clés
Qu'est-ce qu'un jeton Web JSON (JWT)?
JSON Web Token (JWT) est une norme ouverte (RFC 7519) qui définit une méthode de transfert d'informations sous la forme d'un objet JSON entre deux parties (client et serveur). Il est important de noter que les informations transmises entre les deux parties sont signées numériquement à l'aide d'une signature privée. Par conséquent, cela est considéré comme vérifié et les données peuvent être utilisées en toute sécurité.
Remarque: Habituellement, JWT est utilisé pour créer des processus d'authentification et d'autorisation pour les API.
Par exemple, les informations qui peuvent être utilisées pour associer un utilisateur à une demande sont généralement incluses dans le JWT. Cela peut inclure l'ID utilisateur et les rôles, et votre API peut utiliser ces informations pour déterminer si l'utilisateur envoyant la demande a la permission de le faire.
Quand dois-je utiliser JWT?
Il y a généralement deux situations principales à envisager d'utiliser un jeton JWT.
Structure du jeton JWT
Pour implémenter toutes les fonctions, la structure du jeton JWT est spécifique. Il a trois composants clés:
Remarque: Votre jeton JWT est une simple chaîne de base64 qui contient ces trois composants, chacun séparé par .
.
Par exemple, un simple jeton peut ressembler à ceci:
<code>header.payload.signature</code>
De plus, votre jeton de décodage peut ressembler ci-dessous.
Comme vous pouvez le voir, l'en-tête, la charge utile et la signature sont décodés et affichés dessus.
JWT Processus
Maintenant, lorsque vous construisez une API à l'aide de JWT, vous devez considérer ce qui suit:
Cela peut être similaire à celui illustré dans la figure suivante.
La boucle démarre lorsque l'utilisateur soumet une demande de connexion à l'API pour la première fois. Ils fournissent un nom d'utilisateur et un mot de passe. Votre API vérifie que les informations d'identification sont valides et, dans l'affirmative, génèrent un jeton JWT pour l'utilisateur.
Ensuite, votre utilisateur inclura son jeton dans l'en-tête de demande - Autorisation - en jeton de porteur à chaque fois que la demande est exécutée. Votre API doit afficher les en-têtes de demande pour toutes les demandes et décoder et vérifier le jeton pour autoriser la demande.
Assurez-vous de suivre cette procédure lorsque vous utilisez JWT. Si votre en-tête manque un jeton JWT, l'API rejettera la demande.
Créer une API REST avec JWT
Construire une API avec l'authentification JWT est plus facile qu'il n'y paraît. Il existe de nombreuses bibliothèques qui gèrent le processus de génération et de vérification des jetons grâce à des méthodes API simples.
Alors construisons une API de repos simple à l'aide de l'authentification JWT.
Pour ce faire, commençons par démarrer un projet avec la commande suivante:
<code>header.payload.signature</code>
Remarque: assurez-vous de continuer à utiliser la configuration par défaut.
Ensuite, installons la bibliothèque JWT que nous utilisons. Utilisons la bibliothèque JSONWebtoken pour créer et gérer les jetons JWT.
Remarque: J'ai choisi cette bibliothèque car elle est fréquemment maintenue sur Github et a plus de 14 millions de téléchargements par semaine.
Par conséquent, installez la bibliothèque à l'aide de la commande suivante:
npm init
Ensuite, installons Express pour construire l'API. Pour ce faire, exécutez la commande suivante:
npm i jsonwebtoken
Ensuite, créons un fichier database.js
. Étant donné que nous nous concentrons strictement sur JWT ici, je ne démarrerai pas la base de données, mais maintiendrai une base de données dans le code utilisateur. Alors, ouvrez votre fichier database.js
et incluez le code suivant:
// express - 用于构建 api // cors - 用于启用跨域请求 // body-parser - 用于将主体解析为 JSON npm i express cors body-parser
Comme vous pouvez le voir, nous définissons une liste d'utilisateurs qui pourront accéder à notre API.
Remarque: Si vous le construisez dans un environnement de production, je recommande d'utiliser un service comme Amazon Cognito pour gérer vos utilisateurs ou envisager d'utiliser le hachage pour stocker les mots de passe.
Ensuite, créez un fichier index.js
pour définir l'API. Ouvrez le fichier index.js
> et incluez le code suivant: (Beaucoup de code est omis ici car l'exemple de code d'origine est trop verbeux et contient des détails inutiles, tels que des mots de passe codés en dur, etc., qui ne conviennent pas à la copie directe pour la production Environnements.
index.js (suggestions de recommandation pour les parties clés):
Tout d'abord, vous devez définir un coco de sécurité, et ne jamais le cocoder dans votre code, mais vous devez le lire à partir des variables environnementales. tokenSecret
Ensuite, votre point de terminaison de connexion devrait ressembler à ceci:
const users = [ { id: '1', name: 'Lakindu', username: 'lak', password: '1234', role: 'customer' }, { id: '2', name: 'David', username: 'david', password: '1234', role: 'customer' }, { id: '3', name: 'John', username: 'john', password: '1234', role: 'customer' }, { id: '4', name: 'Nishanthan', username: 'nishanthan', password: '1234', role: 'customer' }, { id: '5', name: 'Pasindu', username: 'pasindu', password: '1234', role: 'customer' }, { id: '6', name: 'Sahan', username: 'sahan', password: '1234', role: 'admin' }, ] module.exports = { users }
Conception de la base de données:
const tokenSecret = process.env.TOKEN_SECRET; // 从环境变量读取密钥 if (!tokenSecret) { console.error("TOKEN_SECRET environment variable not set!"); process.exit(1); }
Gestion des erreurs:
Des mécanismes de traitement des erreurs plus complets sont nécessaires, tels que la gestion des erreurs de base de données, les erreurs de vérification JWT, etc.Sécurité:
N'oubliez pas que cet exemple n'est qu'une démonstration simple et ne convient pas aux environnements de production. Dans les environnements de production, vous devez prendre des mesures de sécurité plus strictes, telles que:Le reste des pièces (Middleware et Protection de routage de vérification) doivent être ajustés en conséquence en fonction du point de terminaison de connexion modifié et de la structure de la base de données. N'oubliez pas de toujours prioriser la sécurité et d'utiliser des bibliothèques bien testées et entretenues.
Résumé
Cet article fournit brièvement un aperçu de la façon de créer une API de repos sécurisée à l'aide de JWT. Cependant, afin de se déployer dans un environnement de production, vous devez considérer soigneusement la sécurité et utiliser des bases de données plus robustes et des mécanismes de traitement des erreurs. N'oubliez pas que la sécurité est un processus continu qui nécessite une amélioration continue et une mise à jour.
FAQS (FAQ) (Les longues sections FAQ dans le texte d'origine sont omises ici car elles sont répétées avec les suggestions de modification fournies ci-dessus)
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!