Tanggal :11 September 2024
Autentikasi API dengan Laravel Sanctum

Autentikasi API dengan Laravel Sanctum

Assalamualaikum Warohmatulloh Wabarokatuh, dalam tulisan ini kita akan belajar bagaimana membuat autentikasi API dengan Laravel Sanctum. Sanctum, entah sejak Laravel versi 8 titik berapa menjadi package default yang pada dependency ketika menginstal Laravel.

Sanctum sejatinyua menyediakan dua metode autentikasi. Pertama adalah untuk web frontend yang menggunakan cookies dan yang kedua adalah dengan token untuk aplikasi mobile (Android / iOs).

Skenarionya kita akan buat autentikasi untuk API yang akan kita sajikan untuk pengembang Aplikasi Android ataupun iOs.

Sebelum memulai untuk bikin aplikasinya, instal dulu Laravel dan setup database serta jalankan migration bawaaan Laravel.

Buat Endpoint API Register

Pertama kita perlu buat sebuah endpoint untuk mendaftarkan user dan memberikan akses token. Seperti biasanya kita mulai dari membuat controller terlebih dahulu, kali ini kita akan gunakan Single Action Controller. Gunakan perintah di bawah ini.

php artisan make:controller Api\\Auth\\RegisterController -i

Kemudian buat sebuah Class Resource untuk mengatur bentuk response, gunakan perintah.

php artisan make:resource UserResource

Berikutnya sesuaikan bentuk response yang ingin kita tampilkan pada file app/Http/Resources/UserResource.php.

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource 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,
            'email' => $this->email,
        ];
    }
}

Kemudian cari controller yang sudah terbuat pada app/Http/Controllers/Api/Auth/RegisterController.php dan ubah kodenya menjadi seperti ini.

<?php

namespace App\Http\Controllers\Api\Auth;

use App\Actions\Fortify\PasswordValidationRules;
use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

class RegisterController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {
        $this->validate($request, [
            'name' => ['required', 'string', 'max:255'],
            'email' => [ 'required', 'string', 'email', 'max:255', Rule::unique(User::class),],
            'password' => ['required','min:8'],
        ]);

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);

        $token = $user->createToken('myAppToken');

        return (new UserResource($user))->additional([
            'token' => $token->plainTextToken,
        ]);
    }
}

Selanjutnya daftarkan pada route/api.php

Route::post('auth/register', \App\Http\Controllers\Api\Auth\RegisterController::class);

Kemudian lakukan pengujian dengan menggunakan Postman Rest Client.

Autentikasi API dengan Laravel Sanctum
Buat sebuah request baru dan arahkan ke endpoint http://sanctum.test/api/auth/register dan set header Authorization dengan nilai application/json.
Autentikasi API dengan Laravel Sanctum
Isi body request dengan data yang sesuai agar lolos validasi dan mendapatkan response seperti yang ada pada gambar di atas.

Buat Endpoint API Login

<?php

namespace App\Http\Controllers\Api\Auth;

use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use Illuminate\Http\Request;

class LoginController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {
        $credentials = $request->validate([
            'email' => ['required'],
            'password' => ['required'],
        ]);

        if (auth()->attempt($credentials)) {
            $user = auth()->user();

            return (new UserResource($user))->additional([
                'token' => $user->createToken('myAppToken')->plainTextToken,
            ]);
        }

        return response()->json([
            'message' => 'Your credential does not match.',
        ], 401);
    }
}

Daftarkan route login ke dalam routes/api.php.

Route::post('auth/login', \App\Http\Controllers\Api\Auth\LoginController::class);
Autentikasi API dengan Laravel Sanctum
Uji coba login dengan user yang sebelumnya terdaftar.

Menggunakan Token untuk mengakses endpoint yang dilindungi Middleware

Pada percobaan di atas kita sudah berhasil mendapatkan token, nah token tersebut yang akan berguna sebagai credential untuk mengakses endpoint yang dilindungi middleware auth. Kebetulan pada file routes/api.php sudah ada sebuah endpoint yang bisa digunakan untuk uji coba.

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

Untuk uji coba gunakan Postman lagi.

Contoh request gagal autentitkasi

Seperti yang terlihat pada gambar di atas, request yang kita kirimkan gagal karena tidak terautentikasi. Lalu bagaimana cara melakukan autentikasi dengan token pada sebuah API? caranya dengan menambahkan header Authorization, kemudian isi nilainya dengan Bearer(spasi)[Token].

API Token Sanctum

Jika header Authorization sudah terisi dan request dikirim, maka kita akan mendapatkan response seperti ini.

API Token Sanctum
Request dengan header Authorization.

Atau bisa gunakan tab Authorization pilih Bearer Token lalu isi dengan token yang dimiliki.

Request dengan tab Authorization.

Seperti itulah kurang lebihnya untuk membuat Autentikasi API dengan Laravel Sanctum, semoga bermanfaat.

Wassalamualaikum Warohmatulloh Wabarokatuh.

Hai semua, saya Amirul seorang Software Engineer, suka membuat konten pembelajaran berupa artikel, video tutorial maupun podcast

Tinggalkan Balasan