Introduction
Dans cet article, j'expliquerai l'authentification par jeton API d'une manière facile à comprendre à l'aide de diagrammes.
Après avoir eu une compréhension approximative du fonctionnement de l'authentification par jeton API, j'expliquerai comment fonctionne l'authentification par jeton API à l'aide de Laravel Sanctum de manière basée sur le code.
En lisant cet article, vous apprendrez ce qui suit
- Comment fonctionne l'authentification par jeton API
- Comment installer Laravel Sanctum
- Génération d'un jeton API lors de l'enregistrement et de la connexion de l'utilisateur
- Authentification par jeton API pour restreindre l'accès et vérifier la propriété des ressources
- Suppression du jeton API à la déconnexion
Comment fonctionne l'authentification par jeton API
1. Demande d'inscription/de connexion d'un utilisateur
Le client envoie les informations de connexion de l'utilisateur (par exemple, e-mail, mot de passe) au serveur d'authentification.
2. Authentification de l'utilisateur
Le serveur d'authentification vérifie les informations de connexion pour vérifier si l'utilisateur existe et si le mot de passe est correct.
3. Génération de jetons API
Une fois la connexion réussie, le serveur Auth génère un jeton API pour l'utilisateur. Le jeton API généré est stocké dans la table personal_access_tokens.
4. Demande d'API
Le client envoie une requête API au serveur de ressources, en attachant le jeton API généré à l'en-tête d'autorisation.
5. Vérification du jeton API
Le serveur de ressources vérifie le jeton API. Si le jeton API est valide, la demande est traitée.
6. Réponse API
Le serveur de ressources renvoie une réponse API.
Comment installer Laravel Sanctum
sail php artisan install:api
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Cette commande génère le fichier api.php et les fichiers de migration nécessaires à l'authentification du jeton API dans le cadre du projet Laravel.
Ensuite, exécutez la migration :
sail artisan migrate
Copier après la connexion
Copier après la connexion
Copier après la connexion
Cela crée la table personal_access_tokens.
2024_10_23_231407_create_personal_access_tokens_table ......... 3.84ms DONE
Copier après la connexion
Copier après la connexion
Copier après la connexion
Génération d'un jeton API lors de l'enregistrement et de la connexion de l'utilisateur
Exemple de code
api.php
Route::post('/register', [AuthController::class, 'register']);
Copier après la connexion
Copier après la connexion
AuthController.php
public function register(Request $request)
{
$fields = $request->validate([
'name' => 'required|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|confirmed'
]);
$user = User::create($fields);
$token = $user->createToken($request->name);
return [
'user' => $user,
'token' => $token->plainTextToken
];
}
Copier après la connexion
Inscription des utilisateurs
- Inscription des utilisateurs.
- Le nouvel utilisateur est enregistré dans le tableau des utilisateurs.
- Un jeton API est généré. (créerToken)
- Le jeton API généré et les informations utilisateur sont stockés dans la table personal_access_tokens, et le jeton API est fourni à l'utilisateur.
Exemple de code
api.php
*Route*::post('/login', [*AuthController*::class, 'login']);
Copier après la connexion
AuthController.php
sail php artisan install:api
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Connexion utilisateur
- Connexion utilisateur.
- Vérifie si l'utilisateur existe dans la table des utilisateurs.
- Le jeton API est généré après une connexion réussie. (créerToken)
- Le jeton API généré et les informations utilisateur sont stockés dans la table personal_access_tokens, et le jeton API est fourni à l'utilisateur.
*Remarque : un nouveau jeton API est généré à chaque fois qu'un utilisateur se connecte.
Génération de jetons API
À l'aide de Postman, envoyez une requête API avec les conditions suivantes pour vérifier la réponse.
Une fois la connexion réussie, un jeton API est généré.
Vous pouvez consulter la table personal_access_tokens pour confirmer que le nom de l'utilisateur connecté et le jeton API sont enregistrés.
*Remarque : le jeton dans la réponse de l'API diffère du jeton dans la table personal_access_tokens car il est haché lorsqu'il est stocké dans la base de données.
Authentification par jeton API
- L'utilisateur envoie une requête API et inclut le jeton API dans l'en-tête d'autorisation.
-
auth:sanctum middleware fait correspondre le jeton API reçu de la requête API au jeton API stocké dans la table personal_access_tokens.
- Si le jeton API est authentifié avec succès, le serveur de ressources traite la demande API.
- L'utilisateur authentifié peut mettre à jour ou supprimer des publications.
- Le serveur de ressources renvoie une réponse API.
Restreindre l'accès aux fonctions de publication
Ce qui suit est un exemple de code du processus CRUD pour les publications associées à un utilisateur.
Exemple de code : PostController.php
À l'aide de Laravel Sanctum, limitez l'accès afin que seuls les utilisateurs connectés puissent créer, modifier et supprimer des publications associées à un utilisateur.
Envoyez une demande API réelle pour vérifier que l'authentification par jeton API est effectuée correctement.
Normes de contrôle d'accès
API utilisateur
- index, afficher
Ces actions fournissent des informations généralement publiques et ne nécessitent pas d'authentification par jeton API pour une meilleure expérience utilisateur et un meilleur référencement.
- stocker, mettre à jour, supprimer
Pour empêcher tout accès non autorisé et maintenir l'intégrité des données, une authentification par jeton API est requise.
API d'administration
- indexer, afficher, stocker, mettre à jour, supprimer
Pour une sécurité renforcée, les API qui n'ont pas besoin d'être publiques doivent être sécurisées en exigeant l'authentification de l'utilisateur pour toutes les actions du contrôleur.
Codage
Il est également possible de restreindre l'accès à tous les points de terminaison des publications définies dans apiResource en écrivant ce qui suit dans le fichier de routage.
api.php
sail php artisan install:api
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
sail artisan migrate
Copier après la connexion
Copier après la connexion
Copier après la connexion
Dans ce cas, nous souhaitons définir l'authentification par jeton API uniquement pour les actions de stockage, de mise à jour et de suppression dans PostController. Pour ce faire, créez une méthode constructeur dans PostController et appliquez le middleware auth:sanctum à toutes les actions sauf index et show.
PostController.php
2024_10_23_231407_create_personal_access_tokens_table ......... 3.84ms DONE
Copier après la connexion
Copier après la connexion
Copier après la connexion
Désormais, les utilisateurs doivent inclure le jeton dans la demande lors de la création, de la mise à jour ou de la suppression d'une publication.
En testant cette configuration, si vous envoyez une demande sans le jeton d'autorisation pour créer une publication, une erreur 401 avec un message « Non authentifié » est renvoyée et la création de la publication échoue.
Si le jeton d'autorisation est inclus, les données sont créées avec succès.
De même, l'API de mise à jour et de suppression des publications nécessite que la demande soit envoyée avec le Token dans l'en-tête Autorisation.
Vérification de la propriété après la publication
Des restrictions d'accès des utilisateurs ont été mises en œuvre avec l'authentification par jeton API.
Cependant, il y a toujours un problème.
Dans son état actuel, les utilisateurs authentifiés peuvent mettre à jour ou supprimer les publications d'un autre utilisateur.
Ajoutez un processus pour vérifier que l'utilisateur est propriétaire de la publication.
- L'utilisateur envoie une requête API et inclut le jeton API dans l'en-tête d'autorisation.
-
auth:sanctum middleware fait correspondre le jeton API reçu de la requête API au jeton API stocké dans la table personal_access_tokens.
-
auth:sanctum middleware obtient l'utilisateur associé au jeton API et vérifie si cet utilisateur est propriétaire de la publication cible.
- Si le jeton API est authentifié avec succès et que l'utilisateur est propriétaire de la publication cible, le serveur de ressources traitera la demande API.
- L'utilisateur authentifié et propriétaire des publications peut mettre à jour et supprimer les publications.
- Le serveur de ressources renvoie une réponse API.
Codage
Écrivez la logique d'autorisation dans le fichier de stratégie Laravel afin que seuls les utilisateurs propriétaires des publications puissent mettre à jour et supprimer les publications.
PostController.php
sail php artisan install:api
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
- Réception d'une demande
- L'utilisateur envoie une demande d'API et inclut le jeton API dans l'en-tête d'autorisation.
- Vérification du jeton
- Le serveur de ressources obtient le jeton API de l'en-tête Authorization de la demande API.
Et vérifie ensuite que le jeton API reçu de la demande correspond au jeton API stocké dans la table personal_access_tokens.
- Identification de l'utilisateur
- Si le token est valide, l'utilisateur associé au token est identifié.
Nous pouvons obtenir l'utilisateur identifié avec la méthode $request->user().
- Appeler une stratégie
La méthode Gate::authorize transmet l'utilisateur authentifié et les objets ressources comme arguments aux méthodes de la stratégie.
PostPolicy.php
sail artisan migrate
Copier après la connexion
Copier après la connexion
Copier après la connexion
modifier la méthode :
- Arguments :
- $user : Instance de l'utilisateur actuellement authentifié.
- $post : Une instance du modèle Post.
- Logique :
- Vérifiez si l'utilisateur actuellement authentifié est propriétaire de la publication spécifiée.
Mise à jour du message d'autres utilisateurs
- Définissez l'identifiant de la publication comme paramètre de chemin pour publier le point de terminaison de l'API de mise à jour.
- Incluez le jeton d'un utilisateur qui n'est pas propriétaire de cette publication dans l'en-tête Autorisation.
- Renvoie un message d'erreur 403 indiquant que vous n'êtes pas le propriétaire de la publication.
Suppression du jeton API à la déconnexion
Flux de déconnexion
- L'utilisateur envoie une requête API et inclut le jeton API dans l'en-tête d'autorisation
-
auth:sanctum middleware fait correspondre le jeton API reçu de la requête API au jeton API stocké dans la table personal_access_tokens.
- Si le jeton API est authentifié avec succès, le serveur de ressources traite la demande API.
- Supprimez le jeton API de l'utilisateur authentifié de la table personal_access_tokens.
- Le serveur de ressources renvoie une réponse API.
Codage
api.php
2024_10_23_231407_create_personal_access_tokens_table ......... 3.84ms DONE
Copier après la connexion
Copier après la connexion
Copier après la connexion
Appliquez le middleware auth::sanctum pour le routage de déconnexion et définissez l'authentification par jeton API.
AuthController.php
Route::post('/register', [AuthController::class, 'register']);
Copier après la connexion
Copier après la connexion
Le serveur supprimera le jeton API actuel de la base de données. Cela rend le jeton invalide et ne peut plus être utilisé.
Le serveur renvoie une réponse au client indiquant que la déconnexion a réussi.
Résumé
Dans cet article, l'authentification par jeton API a été expliquée de manière facile à comprendre à l'aide de diagrammes.
En tirant parti de Laravel Sanctum, une authentification simple et sécurisée peut être réalisée à l'aide de jetons API, qui permettent aux clients d'accorder des droits d'accès à des utilisateurs individuels avec une flexibilité différente de l'authentification basée sur la session. Grâce à un middleware et à des politiques, les requêtes API peuvent également être protégées efficacement, l'accès restreint et la propriété des ressources vérifiée.
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!