Laravel 8 Rest API CRUD With Passport Auth Tutorial


We learn Laravel 8 Rest API crud with passport auth example. In this tutorial, we will learn how to create a Restful CRUD API with passport auth in laravel 8. The passport auth usually used to send information that can be trusted and verified using a digital signature. In RESTful APIs, we use the HTTP methods as actions, and the endpoints are the resources acted upon. We are using the HTTP verbs for their meaning:

  • GET: retrieve resources
  • POST: create resources
  • PUT: update resources
  • DELETE: delete resources

Now let us see how we can use the Laravel API step by step. Restful API in Laravel 8 using Passport Authentication. We will also show you a fully functional CRUD for user products using API.

  • Login API
  • Register API
  • GetUser Info API
  • Product List API
  • Create Product API
  • Edit Product API
  • Update Product API
  • Delete Product API

Laravel 8 [Rest API CRUD] With Passport Auth Tutorial | Laravel API
Step 1: Download Laravel 8 App

Open the command prompt and run the following command to install laravel 8 app:

composer create-project --prefer-dist laravel/laravel blog
Step 2: Database Configuration

Then, Navigate the root directory of your installed laravel 8 restful authentication API with a passport tutorial project. And open .env file. Then add the database details as follow:

DB_CONNECTION=mysql 
 DB_HOST=127.0.0.1 
 DB_PORT=3306 
 DB_DATABASE=here your database name here
 DB_USERNAME=here database username here
 DB_PASSWORD=here database password here
Step 3: Install Passport Auth

In this step, run the below command and install passport package :

composer require laravel/passport


After successfully install laravel 8 passport, register providers. Open config/app.php. and put the bellow code :

// config/app.php

'providers' =>[
 Laravel\Passport\PassportServiceProvider::class,
 ],

Now, you need to install laravel 8 to generate passport encryption keys. This command will create the encryption keys needed to generate secure access tokens:

php artisan passport:install
Step 4: Passport Configuration

Navigate to App/Models directory and open User.php file. Then update the following code into 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;
use Laravel\Passport\HasApiTokens;
 
class User extends Authenticatable
{
    use Notifiable, HasApiTokens;
 
    /**
     * 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',
    ];
}

Next Register passport routes in App/Providers/AuthServiceProvider.php, Go to App/Providers/AuthServiceProvider.php and update this line => Register Passport::routes(); inside of boot method:

<?php
namespace App\Providers;
use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
 
 
class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];
 
 
    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
    }
}

Next, Navigate to config/auth.php and open the auth.php file. Then Change the API driver to the session to passport. Put this code ‘driver’ => ‘passport’, in API:

     [ 
         'web' => [ 
             'driver' => 'session', 
             'provider' => 'users', 
         ], 
         'api' => [ 
             'driver' => 'passport', 
             'provider' => 'users', 
         ], 
     ],
Step 5: Create Product Table And Model

open the terminal and run the following command to create a product model and migration file:

php artisan make:model Product -m


After that, navigate to the database/migrations directory and open the create_products_table.php file. Then update the following code into it:

<?php
 
 
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
 
 
class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->text('detail');
            $table->timestamps();
        });
    }
 
 
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}

Add a fillable property in product.php file, so navigate to app/models directory and open product.php file and update the following code into it:

<?php
   
namespace App\Models;
 
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
    
class Product extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'detail'
    ];
}
Step 6: Run Migration

you need to do migration using the bellow command. This command creates tables in the database :

php artisan migrate
Step 6: Create Auth And CRUD APIs Route

In this step, create rest API auth and crud operation laravel 8 routes.

So, navigate to the routes directory and open api.php. Then update the following routes into the api.php file:

use App\Http\Controllers\API\PassportAuthController;
use App\Http\Controllers\API\ProductController;
 
Route::post('register', [PassportAuthController::class, 'register']);
Route::post('login', [PassportAuthController::class, 'login']);
  
Route::middleware('auth:api')->group(function () {
    Route::get('get-user', [PassportAuthController::class, 'userInfo']);
 
 Route::resource('products', [ProductController::class]);
 
});
Step 7: Create Passport Auth And CRUD Controller

Create a controllers name PassportAuthController and ProductController. Use the below command and create a controller :

php artisan make:controller Api\PassportAuthController


php artisan make:controller Api\ProductController


Then, Create some authentication methods in PassportAuthController.php. So navigate to app/http/controllers/API directory and open the PassportAuthController.php file. And, update the following methods into your PassportAuthController.php file:

<?php
 
namespace App\Http\Controllers\API;
 
use App\Http\Controllers\Controller;
 
use Illuminate\Http\Request;
 
use App\Models\User;
 
class AuthController extends Controller
{
    /**
     * Registration Req
     */
    public function register(Request $request)
    {
        $this->validate($request, [
            'name' => 'required|min:4',
            'email' => 'required|email',
            'password' => 'required|min:8',
        ]);
  
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);
  
        $token = $user->createToken('Laravel8PassportAuth')->accessToken;
  
        return response()->json(['token' => $token], 200);
    }
  
    /**
     * Login Req
     */
    public function login(Request $request)
    {
        $data = [
            'email' => $request->email,
            'password' => $request->password
        ];
  
        if (auth()->attempt($data)) {
            $token = auth()->user()->createToken('Laravel8PassportAuth')->accessToken;
            return response()->json(['token' => $token], 200);
        } else {
            return response()->json(['error' => 'Unauthorised'], 401);
        }
    }
 
    public function userInfo() 
    {
 
     $user = auth()->user();
      
     return response()->json(['user' => $user], 200);
 
    }
}

Next, Create rest API crud methods in ProductController.php. So navigate to app/http/controllers/API directory and open the ProductController.php file. And, update the following methods into your ProductController.php file:

<?php
	namespace App\Http\Controllers\API;
	use App\Http\Controllers\Controller;
	use App\Models\Product;
	use Illuminate\Http\Request;
	use Validator;
class ProductController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
	{
		$products = Product::all();
		return response()->json([
		"success" => true,
		"message" => "Product List",
		"data" => $products
		]);
	}
/**
* Store a newly created resource in storage.
*
* @param  \Illuminate\Http\Request  $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
	{
		$input = $request->all();
		$validator = Validator::make($input, [
		'name' => 'required',
		'detail' => 'required'
		]);
			if($validator->fails()){
			return $this->sendError('Validation Error.', $validator->errors());       
			}
		$product = Product::create($input);
		return response()->json([
		"success" => true,
		"message" => "Product created successfully.",
		"data" => $product
		]);
	} 
/**
* Display the specified resource.
*
* @param  int  $id
* @return \Illuminate\Http\Response
*/
public function show($id)
	{
		$product = Product::find($id);
		if (is_null($product)) {
		return $this->sendError('Product not found.');
		}
		return response()->json([
		"success" => true,
		"message" => "Product retrieved successfully.",
		"data" => $product
		]);
	}
/**
* Update the specified resource in storage.
*
* @param  \Illuminate\Http\Request  $request
* @param  int  $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Product $product)
	{
		$input = $request->all();
		$validator = Validator::make($input, [
		'name' => 'required',
		'detail' => 'required'
		]);
			if($validator->fails()){
			return $this->sendError('Validation Error.', $validator->errors());       
			}
		$product->name = $input['name'];
		$product->detail = $input['detail'];
		$product->save();
		return response()->json([
		"success" => true,
		"message" => "Product updated successfully.",
		"data" => $product
		]);
	}
/**
* Remove the specified resource from storage.
*
* @param  int  $id
* @return \Illuminate\Http\Response
*/
public function destroy(Product $product)
	{
		$product->delete();
		return response()->json([
		"success" => true,
		"message" => "Product deleted successfully.",
		"data" => $product
		]);
	}
}

Then open the command prompt and run the following command to start the development server:

php artisan serve
Step 8: Test Laravel 8 REST CRUD API With Passport Auth In Postman

We will call above create crud and auth APIs in the postman app:

Laravel Register Rest API: http://localhost/demopassport/public/api/v1/register

Login API: http://localhost/demopassport/public/api/v1/login


Next Step, you will call getUser, create product, list product, edit product, and delete product APIs, In this APIs need to pass the access token as headers:

‘headers’ => [
‘Accept’ => ‘application/json’,
‘Authorization’ => ‘Bearer ‘.$accessToken,
] 

- Product List API: http://127.0.0.1:8000/api/products ( Method:- GET)

- Product Create API: http://127.0.0.1:8000/api/products (Method:- POST)

- Product Fetch API: http://127.0.0.1:8000/api/products/{id} (Method:- GET)

- Product Update API: http://127.0.0.1:8000/api/products/{id} (Method:- PUT)

- Product Delete API: http://127.0.0.1:8000/api/products/{id} (Method:- DELETE)

Laravel 8 restful CRUD APIs with passport auth tutorial, you have learned how to build rest CRUD APIs with passport auth in laravel 8. And as well as how to call these APIs on the postman app.


I hope it can help you...

Leave a Reply

Your privacy will not be published. Required fields are marked *

We'll share your Website Only Trusted.!!