andriajah Sun Apr 2022 1 year ago

Tutorial Laravel 9 REST API Otentikasi menggunakan Sanctum

Di sini, saya akan menunjukkan cara otentikasi API laravel 9 sanctum. Anda akan belajar laravel 9 rest API menggunakan sanctum. Anda dapat melihat contoh API laravel 9 sanctum spa. Anda dapat melihat contoh API laravel 9 sanctum.

Laravel 9 Sanctum menyediakan sistem otentikasi sederhana untuk SPA (aplikasi halaman tunggal), aplikasi seluler, dan API berbasis token sederhana. Sanctum juga memungkinkan setiap pengguna aplikasi Anda menghasilkan beberapa token API untuk akun mereka.

Jika Anda juga ingin membuat API untuk aplikasi seluler Anda, Anda dapat mengikuti tutorial ini untuk cara membuat API lainnya selangkah demi selangkah dengan laravel 9 dan sanctum. Jika Anda baru maka jangan khawatir tentang itu saya menulis tutorial langkah demi langkah.

 

Ikuti beberapa langkah di bawah ini untuk membuat contoh rest full API di aplikasi laravel 9.

Langkah 1: Install Laravel 9

Langkah ini tidak diperlukan; namun, jika Anda belum membuat aplikasi laravel, Anda dapat melanjutkan dan menjalankan perintah di bawah ini:

composer create-project laravel/laravel example-app

Langkah 2: Gunakan Sanctum

Pada langkah ini kita perlu menginstal sanctum melalui manajer paket Composer, jadi satu terminal Anda dan jalankan perintah di bawah ini:

composer require laravel/sanctum

Setelah berhasil menginstal paket, kita perlu mempublikasikan file konfigurasi dengan perintah berikut:

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

kami perlu mendapatkan migrasi default untuk membuat tabel tempat baru di database kami. jadi mari kita jalankan perintah di bawah ini.

php artisan migrate

Selanjutnya kita perlu menambahkan middleware untuk sanctum api, jadi mari kita tambahkan seperti di bawah ini:

app/Http/Kernel.php

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

Langkah 3: Konfigurasi Sanctum

Pada langkah ini, kita harus melakukan konfigurasi pada tiga model tempat, penyedia layanan dan file konfigurasi auth. Jadi, Anda hanya perlu mengikuti perubahan pada file itu.

 

Dalam model kami menambahkan kelas HasApiTokens dari Sanctum, Di auth.php, kami menambahkan konfigurasi api auth.

app/Model/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\Sanctum\HasApiTokens;
  
class User extends Authenticatable
{
    use HasFactory, 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',
    ];
}

 

Langkah 4: Tambahkan Tabel dan Model Product

Selanjutnya, kita perlu membuat migrasi untuk tabel produk menggunakan perintah Laravel 9 php artisan, jadi pertama jalankan perintah di bawah ini:

php artisan make:migration create_products_table

Setelah perintah ini, Anda akan menemukan satu file di path  database/migrations berikut dan Anda harus meletakkan kode di bawah ini di file migrasi Anda untuk membuat tabel product.

<?php
  
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
  
return new class 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 migrasi, kita perlu menjalankan migrasi di atas dengan perintah berikut:

php artisan migrate

 

Setelah membuat tabel "produk", Anda harus membuat model Produk untuk produk, jadi pertama-tama buat file di path ini app/Models/Product.php dan letakkan konten di bawah ini di file item.php:

 

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: Buat Route API

Pada langkah ini, kita akan membuat route api untuk login, register, dan product rest api. Jadi, mari kita tambahkan route baru pada file itu.

 

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::controller(RegisterController::class)->group(function(){
    Route::post('register', 'register');
    Route::post('login', 'login');
});
        
Route::middleware('auth:sanctum')->group( function () {
    Route::resource('products', ProductController::class);
});

Langkah 6: Buat File Controller

pada langkah selanjutnya, sekarang kita telah membuat pengontrol baru sebagai BaseController, ProductController dan RegisterController, saya membuat folder baru "API" di folder Controllers karena kita akan membuat pengontrol API sendiri, Jadi mari kita buat kedua pengontrol:

 

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')->plainTextToken;
        $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')->plainTextToken; 
            $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.');
    }
    /**
     * 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 $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: Buat Eloquent API Resources

Ini adalah langkah yang sangat penting untuk membuat rest api di laravel 9. Anda dapat menggunakan sumber daya api yang fasih dengan api. itu akan membantu Anda membuat tata letak respons yang sama dari objek model Anda. kami gunakan dalam file ProductController. sekarang kita harus membuatnya menggunakan perintah berikut:

php artisan make:resource ProductResource

Sekarang ada file baru yang dibuat dengan folder baru di path  berikut:

 

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
     */
    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'),
        ];
    }
}

 

Jalankan Aplikasi Laravel:

Semua langkah yang diperlukan telah dilakukan, sekarang Anda harus mengetikkan perintah yang diberikan di bawah ini dan tekan enter untuk menjalankan aplikasi Laravel:

php artisan serve

Sekarang, buka postman Anda dan periksa apis berikut.

 

pastikan secara detail api kita akan menggunakan header berikut seperti yang tercantum di bawah ini:

'headers' => [

    'Accept' => 'application/json',

    'Authorization' => 'Bearer '.$accessToken,

]

 

Berikut adalah URL Route:

Sekarang Anda dapat menjalankan url yang tercantum di atas seperti tangkapan layar di bawah ini:

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

 

2) Login Api Route: Verb:GET, URL:http://localhost:8000/api/login

 

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

 

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

 

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

 

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

 

Saya harap ini dapat membantu Anda...

 

 

laravel laravel 9 rest api auth sanctum laravel 9