api restful sécurisée avec laravel 8

Comment créer un API RESTful sécurisée avec Laravel 8

Partagez sur:

Dans ce tutoriel, nous allons voir comment créer un API RESTful sécurisée avec Laravel 8 à l’aide du package Laravel 8 sanctum.

De même, nous vous expliquerons étape par étape comment tester l’API REST à l’aide de l’outil de test Postman.

Laravel Sanctum propose un système d’authentification sécurisé, incroyablement rapide et léger pour les applications à page unique (SPA), les applications mobiles et les API simples basées sur des jetons.

 

Lire  aussi: Comment importer un fichier Excel dans Laravel

Sanctum est un package complet qui permet à chaque utilisateur de générer indépendamment plusieurs jetons API pour son compte. Ces jetons accordent divers rôles et étendues qui désignent les actions que les jetons sont autorisés à effectuer.

Créer un API RESTful sécurisée avec Laravel 8

Pour créer un API RESTful sécurisée avec Laravel 8, nous allons suivre les étapes suivantes pas à pas.

Créer un projet Laravel

La première étape pour créer un API RESTful sécurisée avec Laravel 8, consiste à créer d’abord un un nouveau projet Laravel 8.

Vous devez ouvrir le terminal, ajoutez la commande suivante pour créer un projet Laravel.

Mais assurez-vous que composer est installé sur votre système.

composer create-project --prefer-dist laravel/laravel laravel-sanctum-auth

 

Configuration de la base de données dans ENV

Vous devez ajouter la configuration de la base de données dans le fichier de configuration .env pour communiquer entre la base de données laravel et mysql.

 

DB_CONNECTION=mysql

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=db_name

DB_USERNAME=root

DB_PASSWORD=

 

 

Installer le paquet Laravel Sanctum

Tapez la commande composer dans le console du terminal et exécutez-la pour commencer à installer le package sanctum dans l’application laravel.

composer require laravel/sanctum

 

 

Mise en place de Sanctum

La bibliothèque Sanctum a été ajoutée dans laravel, et vous devez maintenant ajouter le fournisseur de Sanctum. Par conséquent, publiez la configuration de Sanctum à l’aide de la commande de publication.

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

Ensuite, enregistrez le middleware sanctum dans le tableau api à l’intérieur du fichier app/Http/Kernel.php

protected $middlewareGroups = [
...
...
    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
...
...
];

 

 

Exécutez la commande suivante pour exécuter la migration ; de même, plus tard dans la base de données, nous générerons une table de sanctum pour gérer les informations d’authentification.

 

php artisan migrate

 

Par la suite, nous devons préparer la configuration de sanctum pour le projet. Par conséquent, ajoutez la classe sanctum HasApiTokens dans le fichier app/Models/User.php.

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

// sanctum
use Laravel\Sanctum\HasApiTokens;


class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

 

 

Mettre à jour le modèle et exécuter la migration

Utilisez la commande php artisan pour créer une nouvelle table de migration de blog, tapez la commande dans le terminal et exécutez-la pour générer un nouveau fichier de migration.

 

php artisan make:migration create_blogs_table

 

Vous devez ajouter quelques propriétés dans le fichier de migration, alors ouvrez et ajoutez du code dans le fichier database/migrations/create_blogs_table.php.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateBlogsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('blogs', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('description');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('blogs');
    }
}

 

Ensuite, créez un fichier app/Models/Blog.php et enregistrez les propriétés de migration du produit dans le tableau $fillable.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    use HasFactory;
    protected $fillable = [
        'title', 
        'description'
    ];    
}

 

Exécutez la commande recommandée pour exécuter la migration de la base de données :

php artisan migrate

 

Créer les ressources pour l’API

Il vous permet de gérer une réponse similaire à celle de votre modèle ; par exemple, nous utiliserons BlogController, qui correspondra aux propriétés du modèle Blog.

Exécutez la commande pour générer des ressources API éloquentes de blog.

php artisan make:resource Blog

 

Placez le code suggéré dans app/Http/Resources/Blog.php

<?php
  
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;

class Blog extends JsonResource
{

    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'description' => $this->description,
            'created_at' => $this->created_at->format('m/d/Y'),
            'updated_at' => $this->updated_at->format('m/d/Y'),
        ];
    }
    
}

 

 

Configuration des contrôleurs

Ensuite, nous devons créer trois contrôleurs pour gérer le processus d’authentification ; tout d’abord, créez un répertoire API dans le dossier Controllers ; après cela, créez trois fichiers simultanément dans le dossier, nommez-les AuthController, BaseController et BlogController.

Ces fichiers géreront individuellement les opérations de connexion, d’inscription et de blogs bruts.

Ensuite, ajoutez le code dans le fichier app/Http/Controllers/API/BaseController.php :

<?php


namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller as Controller;


class BaseController extends Controller
{
    /**
     * success response method.
     *
     * @return \Illuminate\Http\Response
     */
    public function sendResponse($result, $message)
    {
    	$response = [
            'success' => true,
            'data'    => $result,
            'message' => $message,
        ];

        return response()->json($response, 200);
    }


    /**
     * return error response.
     *
     * @return \Illuminate\Http\Response
     */
    public function sendError($error, $errorMessages = [], $code = 404)
    {
    	$response = [
            'success' => false,
            'message' => $error,
        ];

        if(!empty($errorMessages)){
            $response['data'] = $errorMessages;
        }

        return response()->json($response, $code);
    }
}

 

 

Ouvrez et placez tout le code suggéré dans le fichier app/Http/Controllers/API/AuthController.php, cela amplifiera le processus d’enregistrement et de connexion de l’utilisateur :

<?php
   
namespace App\Http\Controllers\API;
   
use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use Illuminate\Support\Facades\Auth;
use Validator;
use App\Models\User;
   
class AuthController extends BaseController
{

    public function signin(Request $request)
    {
        if(Auth::attempt(['email' => $request->email, 'password' => $request->password])){ 
            $authUser = Auth::user(); 
            $success['token'] =  $authUser->createToken('MyAuthApp')->plainTextToken; 
            $success['name'] =  $authUser->name;
   
            return $this->sendResponse($success, 'User signed in');
        } 
        else{ 
            return $this->sendError('Unauthorised.', ['error'=>'Unauthorised']);
        } 
    }

    public function signup(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|email',
            'password' => 'required',
            'confirm_password' => 'required|same:password',
        ]);
   
        if($validator->fails()){
            return $this->sendError('Error validation', $validator->errors());       
        }
   
        $input = $request->all();
        $input['password'] = bcrypt($input['password']);
        $user = User::create($input);
        $success['token'] =  $user->createToken('MyAuthApp')->plainTextToken;
        $success['name'] =  $user->name;
   
        return $this->sendResponse($success, 'User created successfully.');
    }
   
}

 

 

Rendez-vous dans le fichier app/Http/Controllers/API/BlogController.php et insérez-y le code des opérations CRUD :

 

<?php
   
namespace App\Http\Controllers\API;
   
use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use Validator;
use App\Models\Blog;
use App\Http\Resources\Blog as BlogResource;
   
class BlogController extends BaseController
{

    public function index()
    {
        $blogs = Blog::all();
        return $this->sendResponse(BlogResource::collection($blogs), 'Posts fetched.');
    }

    
    public function store(Request $request)
    {
        $input = $request->all();
        $validator = Validator::make($input, [
            'title' => 'required',
            'description' => 'required'
        ]);
        if($validator->fails()){
            return $this->sendError($validator->errors());       
        }
        $blog = Blog::create($input);
        return $this->sendResponse(new BlogResource($blog), 'Post created.');
    }

   
    public function show($id)
    {
        $blog = Blog::find($id);
        if (is_null($blog)) {
            return $this->sendError('Post does not exist.');
        }
        return $this->sendResponse(new BlogResource($blog), 'Post fetched.');
    }
    

    public function update(Request $request, Blog $blog)
    {
        $input = $request->all();

        $validator = Validator::make($input, [
            'title' => 'required',
            'description' => 'required'
        ]);

        if($validator->fails()){
            return $this->sendError($validator->errors());       
        }

        $blog->title = $input['title'];
        $blog->description = $input['description'];
        $blog->save();
        
        return $this->sendResponse(new BlogResource($blog), 'Post updated.');
    }
   
    public function destroy(Blog $blog)
    {
        $blog->delete();
        return $this->sendResponse([], 'Post deleted.');
    }
}

 

 

Créer des routes pour l’API

Vous devez utiliser des contrôleurs pour créer des routes api sanctum auth ; nous avons défini la connexion, enregistré les méthodes de publication et les ressources pour créer collectivement l’api d’authentification.

Ouvrez et insérez le code dans le fichier routes/api.php :

 

<?php
  
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
  
use App\Http\Controllers\API\AuthController;
use App\Http\Controllers\API\BlogController;
  
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
*/
  
Route::post('login', [AuthController::class, 'signin']);
Route::post('register', [AuthController::class, 'signup']);
     
Route::middleware('auth:sanctum')->group( function () {
    Route::resource('blogs', BlogController::class);
});

 

Tester l’API REST avec Postman

Nous avons appris à créer un API RESTful sécurisée avec Laravel 8, nous pouvons maintenant procerder aux tests avec Postman. Vous devez démarrer le serveur de développement laravel à l’aide de la commande php artisan :

 

php artisan serve

 

 

Testez l’API de création d’utilisateur

Ouvrez l’application Postman, sélectionnez la méthode Post dans la liste déroulante. Entrez l’itinéraire ou l’URL dans la barre d’adresse, sélectionnez la section Corps, entrez le nom, l’e-mail, le mot de passe et confirmez le mot de passe et cliquez sur envoyer pour créer un utilisateur.

http://localhost:8000/api/register

 

 

Tester l’API de connexion

Ajoutez l’URL suivante dans la barre d’adresse du facteur, basculez la méthode sur GET, entrez l’e-mail et le mot de passe et cliquez sur envoyer pour connecter un utilisateur.

http://localhost:8000/api/login

 

 

 

Définir le jeton d’autorisation

Accédez à l’onglet Autorisation de l’application Postman, sélectionnez « Bearer Token » dans la liste déroulante Type, puis ajoutez le jeton d’authentification que vous avez obtenu lorsque vous êtes connecté à l’application.

 

 

Créer un article avec l’API

Ajoutez l’URL suivante dans la barre d’adresse du facteur, basculez la méthode sur POST, entrez le titre et la description, puis cliquez pour créer une publication et la stocker dans la base de données.

http://localhost:8000/api/blogs

 

Récupérer un article

Vous pouvez maintenant voir comment récupérer un seul article à l’aide de l’identifiant de l’article, utilisez l’URL ci-dessous :

http://localhost:8000/api/blogs/{id}

 

 

Récupérer tous les articles

Vous pouvez récupérer tous les articles à la fois, utilisez donc l’API REST suivante avec la méthode GET pour obtenir tous les enregistrements.

http://localhost:8000/api/blogs

 

 

Mettre à jour un article

Pour mettre à jour un article, ajoutez la route suivante avec la méthode Put pour mettre à jour un seul enregistrement dans la base de données.

http://localhost:8000/api/blogs/{id}

 

 

Supprimer un enregistrement

Pour supprimer un enregistrement, définissez la méthode à supprimer et utilisez l’URL suivante :

http://localhost:8000/api/blogs/{id}

 

Lire aussi: Comment générer des fichiers PDF dans Laravel 8

Conclusion

Dans ce tutoriel, vous avez appris comment créer un API RESTful sécurisée avec Laravel 8 en utilisant le package Laravel Sanctum.


Partagez sur: