ahmadajah03 Sun Nov 2020 1 year ago

Tutorial Laravel 8 REST API dengan Passport Authentication

Artikel ini akan memberi Anda contoh laravel 8 rest api dengan pasport. Anda dapat melihat otentikasi api laravel 8. Artikel ini akan memberi Anda contoh sederhana membuat rest api dengan otentikasi pasport laravel 8. Pada artikel ini, kami akan menerapkan contoh otentikasi pasport laravel 8.

Rest API harus digunakan saat Anda bekerja dengan aplikasi seluler. ketika aplikasi Anda lebih disukai untuk aplikasi web dan aplikasi seluler daripada Anda harus membuat api untuk pengembangan seluler Anda.

Namun Laravel memberikan cara mudah untuk membuat api. jika Anda memiliki otentikasi di aplikasi seluler Anda daripada Anda dapat dengan mudah melakukannya menggunakan paspor. Laravel 8 Passport menyediakan cara untuk membuat token autentikasi untuk memvalidasi pengguna.

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

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 OR command prompt Anda dan jalankan perintah di bawah ini:

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

Langkah 2: Gunakan Pasport

composer require laravel/passport

Setelah berhasil menginstal paket, kita perlu mendapatkan migrasi default untuk membuat tabel pasport baru di database kita. jadi mari kita jalankan perintah di bawah ini.

php artisan migrate

Selanjutnya, kita perlu menginstal paspor menggunakan perintah, Menggunakan perintah passport:install, itu akan membuat kunci token untuk keamanan. Jadi mari kita jalankan perintah di bawah ini:

php artisan passport:install

Langkah 3: Konfigurasi Pasport

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 kelas HasApiTokens dari Paspor,

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\Passport\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',
    ];
}

config/auth.php

<?php


return [
    .....
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
    .....
]

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 database/migrations jalur 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 "product" 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 rute layanan web. Jadi, mari tambahkan rute 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:api')->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')->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\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 eloquent api resources 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,

]

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

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

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

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

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

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

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

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

Anda dapat mengunduh kode dari git: Download Code From GITHUB

Saya harap ini dapat membantu Anda ...

laravel rest full api with passport