Tutorial Rest API Laravel 9 Menggunakan Passport

Pada tutorial kali ini kita akan belajar bagaimana cara membuat Rest API pada Laravel 9 menggunakan Passport, disini kamu akan belajar tentang bagaimana cara membuat rest api pada laravel 9 menggunakan passport, pada tutorial ini kamu juga akan belajar bagaimana membuat rest api dengan implementasi authentication dengan cara yang sederhana menggunakan passport oauth2. Kamu bisa langsung mengikuti langkah demi langkah dari tutorial yang ada disini.

Rest API ini biasanya digunakan oleh aplikasi mobile seperti Android atau iOS atau aplikasi web yang menggunakan ReactJS, VueJS atau teknologi sejenisnya, jika aplikasi yang kamu buat akan terintegrasi dengan mobile application maka kamu harus membuat sebuah API agar bisa diakses oleh aplikasi mobilenya

Oh iya Laravel pada saat ini sangat mudah jika kamu ingin membuat sebuah API, kamu bisa menggunakan Laravel Passport untuk membuat rest API ini. Pada Laravel 9 Passport menyediakan cara yang sangat mudah untuk implementasi auth token untuk melakukan validasi pada user yang mengakses rest API nya.

Jika kamu ingin membuat sebuah rest API kamu bisa mengikuti tutorial ini, saya akan menjelaskan langkah demi langkah Tutorial membuat Rest API pada Laravel 9 menggunakan Passport.

Silahkan ikuti beberapa langkah dibawah ini untuk membuat sebuah restfull API berikut dengan contoh kasusnya pada Laravel 9.

Langkah 1: Menginstall Laravel 9

Cara ini adalah optimal, jika kamu belum membuat project laravel kamu bisa membuatnya dengan mengeksekusi perintah dibawah ini:

composer create-project laravel/laravel example-app

Langkah 2: Menginstall Passport

Pada langkah ini kita akan menginstall Passport menggunakan Composer package manager, kamu bisa mengeksekusi perintah dibawah ini untuk menginstall passport

composer require laravel/passport

Setelah berhasil menginstall package, berikutnya kita perlu mengeksekusi database migration untuk membuat tabel yang dibutuhkan oleh passport kedalam database, silahkan eksekusi perintah dibawah ini untuk menjalankan database migration

php artisan migrate

Selanjutnya, kita perlu menginstall passport menggunakan perintah passport:install, ini kita lakukan untuk membuat sebuah token untuk keamanan, untuk perintah lengkap yang harus dieksekusi untuk menginstall passport ada dibawah ini:

php artisan passport:install

Langkah 3: Konfigurasi Passport

Pada langkah berikut ini kita akan melakukan konfigurasi pada tiga tempat di model, service provider dan auth config file. Silahkan ikuti langkah ini untuk mengubah konfigurasi pada passport.

Pada model kita akan menambahkan HasApiTokens class dari Passport,

Pada auth.php, kita akan menambahkan konfigurasi api auth.

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;
use Laravel\Passport\HasApiTokens;

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

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

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

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

config/auth.php
<?php

return [
    .....
    'guards' => [

        'web' => [

            'driver' => 'session',

            'provider' => 'users',

        ],
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
    .....
]

Langkah 4: Membuat Tabel Product dan Model Product

Berikutnya, kita akan membuat database migration untuk membuat tabel product pada project Laravel 9 menggunakan perintah php artisan, jadi kita bisa membuatnya dengan mengeksekusi perintah:

php artisan make:migration create_products_table

After this command you will find one file in following path database/migrations and you have to put bellow code in your migration file for create products table.

Setelah kita mengekseusi perintah diatas, maka file baru akan berhasil dibuat didalam folder database/migration silahkan kamu buka file migration untuk membuat tabel products

<?php

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

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

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

Setelah membuat database migration kita harus mengeksekusi perintah dibawah agar pada database dibuat tabel products

php artisan migrate

Setelah kita membuat tabel "products" maka kita harus membuat sebuah model untuk tabel products tersebut, silahkan kamu buat file baru pada path app/Models/Product.php lalu kamu isi menggunakan code dibawah ini

app/Models/Product.php
<?php

namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasFactory;
  
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'detail'
    ];
}

Langkah 5: Membuat API Routes

Pada langkah ini kita akan membuat routes api. Laravel sendiri sudah menyediakan file api.php untuk digunakan sebagai route web service. Silahkan buka file tersebut lalu modifikasi seperti code dibawah ini

routes/api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

use App\Http\Controllers\API\RegisterController;
use App\Http\Controllers\API\ProductController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::post('register', [RegisterController::class, 'register']);
Route::post('login', [RegisterController::class, 'login']);

Route::middleware('auth:api')->group( function () {
    Route::resource('products', ProductController::class);
});

Langkah 6: Membuat File Controller

Pada langkah berikut ini kita akan membuat beberapa file Controller yaitu BaseController, ProductController dan RegisterController. Sebelumnya kita harus membuat folder "API" pada folder Controllers karena kita akan membuat sebuah Controller untuk API. Setelah itu silahkan buat file BaseController, ProductController dan RegisterController didalam folder API yang telah kita buat sebelumnya.

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);
    }
}

app/Http/Controllers/API/RegisterController.php
<?php

namespace App\Http\Controllers\API;
   
use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Validator;

class RegisterController extends BaseController
{
    /**
     * Register api
     *
     * @return \Illuminate\Http\Response
     */
    public function register(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|email',
            'password' => 'required',
            'c_password' => 'required|same:password',
        ]);

        if($validator->fails()){
            return $this->sendError('Validation Error.', $validator->errors());       
        }

        $input = $request->all();
        $input['password'] = bcrypt($input['password']);
	$user = User::create($input);
        $success['token'] =  $user->createToken('MyApp')->accessToken;
        $success['name'] =  $user->name;

        return $this->sendResponse($success, 'User register successfully.');
    }
   
    /**
     * Login api
     *
     * @return \Illuminate\Http\Response
     */
    public function login(Request $request)
    {
        if(Auth::attempt(['email' => $request->email, 'password' => $request->password])){ 
	    $user = Auth::user(); 
            $success['token'] =  $user->createToken('MyApp')->accessToken; 
            $success['name'] =  $user->name;
            return $this->sendResponse($success, 'User login successfully.');
        }else{ 
            return $this->sendError('Unauthorised.', ['error'=>'Unauthorised']);
        } 
    }
}

app/Http/Controllers/API/ProductController.php
<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use App\Models\Product;
use Validator;
use App\Http\Resources\ProductResource;

class ProductController extends BaseController
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $products = Product::all();
        return $this->sendResponse(ProductResource::collection($products), 'Products retrieved successfully.');
    }

    /*
     *
     * @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 $this->sendResponse(new ProductResource($product), 'Product created successfully.');
    } 

    /**
     * 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 $this->sendResponse(new ProductResource($product), 'Product retrieved successfully.');
    }

    /**
     * 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 $this->sendResponse(new ProductResource($product), 'Product updated successfully.');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy(Product $product)
    {
        $product->delete();

        return $this->sendResponse([], 'Product deleted successfully.');
    }
}

Langkah 7: Membuat Eloquent API Resources

Langkah berikutnya sangat penting dalam pembuatan rest API pada Laravel 9 ini, kita akan menggunakan Eloquent API resource pada API. Hal ini akan membantu kita dalam menyeragamkan response layout dari model object milik kita yang kita gunakan pada file ProductController. Sekarang kita akan membuatnya menggunakan perintah dibawah ini:

php artisan make:resource ProductResource

Setelah mengeksekusi perintah tersebut makan akan muncul file baru pada path

app/Http/Resources/ProductResource.php
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class ProductResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
     */
    public function toArray($request)
    {
      return [
	'id' => $this->id,
	'name' => $this->name,
	'detail' => $this->detail,
	'created_at' => $this->created_at->format('d/m/Y'),
	'updated_at' => $this->updated_at->format('d/m/Y'),
      ];
        //return parent::toArray($request);
    }
}

Menjalankan aplikasi Laravel

Setelah semua langkah kita lalui akhirnya aplikasi yang kita buat telah selesai, sekarang kita bisa melakukan pengetesan pada aplikasi yang telah kita buat tadi.

Sebelumnya kita jalankan aplikasi yang kita buat tadi menggunakan perintah dibawah ini

php artisan serve

Oh iya untuk memanggil Rest API yang kita buat ini kita perlu menambahkan header Authorization Bearer pada requestnya, seperti dibawah ini

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

Berikut ini daftar routes API yang telah kita buat tadi

1) API Register:
Method:GET,
URL:http://localhost:8000/api/register

2) API Login:
Method:GET,
URL:http://localhost:8000/api/login

3) API Product List:
Method:GET,
URL:http://localhost:8000/api/products

4) API Product Create:
Method:POST,
URL:http://localhost:8000/api/products

5) API Product Show:
Method:GET,
URL:http://localhost:8000/api/products/{id}

6) API Product Update:
Method:PUT,
URL:http://localhost:8000/api/products/{id}

7) API Product Delete:
Method:DELETE,
URL:http://localhost:8000/api/products/{id}

Oh iya kamu bisa download source code tutorial rest api Laravel 9 ini langsung dari GitHub

Semoga bermanfaat ya

Previous Post Next Post