ahmadajah03 Wed Jan 2021 1 year ago

Tutorial Otentikasi API Laravel 8 Sanctum

Hai Dev,

Dalam contoh ini, Anda akan mempelajari tutorial laravel 8 sanctum api. Anda bisa memahami konsep laravel 8 sanctum spa contoh. Ini contoh sederhana dari laravel 8 sanctum example. Anda akan mempelajari contoh rest api laravel 8 sanctum. Jadi, mari ikuti beberapa langkah untuk membuat contoh tutorial token api laravel 8 sanctum.

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

Jadi, Anda juga ingin membuat api untuk aplikasi seluler Anda daripada mengikuti tutorial ini tentang cara membuat rest api selangkah demi selangkah dengan laravel 8 dan sanctum. Jika Anda baru daripada jangan khawatir tentang tutorial yang saya tulis langkah demi langkah.

Ikuti beberapa langkah di bawah ini untuk membuat contoh restful api di aplikasi laravel 8.

Langkah 1: Instal Laravel 8

Saya akan menjelaskan langkah demi langkah dari awal jadi, kita perlu mendapatkan aplikasi Laravel 8 baru menggunakan perintah di bawah ini, Jadi buka terminal Anda ATAU command prompt dan jalankan perintah di bawah ini:

composer create-project --prefer-dist laravel/laravel blog

Langkah 2: Gunakan Sanctum

Pada langkah ini kita perlu menginstal Sanctum melalui manager paket Komposer, jadi salah 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"

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

php artisan migrate

Selanjutnya, kita perlu menambahkan middleware untuk sanctum api, jadi mari 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 three place model, service provider dan file konfigurasi auth. Jadi, Anda hanya perlu mengikuti perubahan pada file itu.

Dalam model kami menambahkan class HasApiTokens dari Sanctum,

Di auth.php, kami 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\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 posting menggunakan perintah Laravel 8 php artisan, jadi 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\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->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 "products" Anda harus membuat model Product untuk product, jadi pertama-tama buat file di jalur 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. Laravel menyediakan file api.php untuk menulis route layanan web. Jadi, mari 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::post('register', [RegisterController::class, 'register']);
Route::post('login', [RegisterController::class, 'login']);
     
Route::middleware('auth:sanctum')->group( function () {
    Route::resource('products', ProductController::class);
});

Langkah 6: Buat File Controller

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

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\Product as 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 8. Anda dapat menggunakan resources apieloquent dengan api. ini akan membantu Anda membuat tata letak respons yang sama dari objek model Anda. kami digunakan dalam file ProductController. sekarang kita harus membuatnya menggunakan perintah berikut:

php artisan make:resource Product

Sekarang ada buat file baru dengan folder baru di jalur berikut:

app/Http/Resources/Product.php

<?php
  
namespace App\Http\Resources;
   
use Illuminate\Http\Resources\Json\JsonResource;
   
class Product 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'),
        ];
    }
}

Sekarang kita siap menjalankan full restful api dan juga passport api di laravel. jadi mari kita jalankan contoh kita jadi jalankan perintah di bawah ini untuk menjalankan cepat:

php artisan serve

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

'headers' => [

    'Accept' => 'application/json',

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

]

Berikut adalah URL Route dengan Verb:

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

 

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

2) Login API: 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}

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

Anda dapat mengunduh kode dari git: Unduh Kode dari Github

 

Saya harap ini dapat membantu Anda ...

laravel laravel auth api sanctum