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