Blog FQSoft

Just Simple Code Documentation

PHP Laravel

Membuat API Authentication Di Laravel

Faiq Himmah 23 December 2023
[ Gambar Post ]

Untuk authentication API pada laravel 10 secara default menggunakan Sanctum. Beberapa fitur sanctum adalah :

  • Menyediakan sistem authentication yang ringan
  • Bisa berjalan pada SPA dan Mobile Application
  • Authentication berbasis token. Sehingga pengguna dapat login dari berbagai perangkat
  • Token juga bisa memilik scope dan hak akses untuk API tertentu

Untuk memastikan apakah sanctum sudah terinstall atau belum. bisa cek file composer.json jika ada laravel/sanctum berarti sudah terinstall. jika belum maka harus diinstall dulu dengan menjalankan perintah dibawah ini :

composer require laravel/sanctum

Selanjutnya melakukan publish pada konfigurasi sanctum dengan menjalankan perintah

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

Dan langkah terakhir adalah melakukan database migration untuk membuat table personal_access_token. dimana tabel ini dibutuhkan oleh sanctum untuk menyimpan token setiap user. Sehingga dengan tabel ini setiap user bisa memiliki lebih dari satu token jika user login dari device yang berbeda. berikut perintah untuk membuat tabel yang dibutuhkan sanctum

php artisan migrate

Selanjutnya kita akan membuat function authentication pada file api.php yang terletak di folder router. contoh lengkapnya bisa dilihat pada code dibawah ini

Route::post('auth', function (Request $request) {
    $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);
 
    $user = User::where('email', $request->email)->first();


    if (! $user || ! Hash::check($request->password, $user->password)) {
        throw ValidationException::withMessages([
            'email' => ['The provided credentials are incorrect.'],
        ]);
        return response()->json([
            'status' => '401',
            'message' => 'Unauthorized',
        ]); 
    }else{
        return response()->json([
            'token' => $user->createToken($request->email)->plainTextToken
        ]);
    }

})->name('auth');

Sebelum mecoba code ditas pastikan tabel users sudah berisi satu user atau lebih. sebagai bahan uji coba. Jika sudah ada user-nya selanjutnya kita memerlukan aplikasi Postman, yaitu aplikasi free untuk menguji RESTful API. Jika belum punya silahkan Download

Selanjutnya buka aplikasi postman dan buat new workspace dan isi formnya dan klik Create Worksapece

Selanjutnya lakukan seperti di gambar :

  • Pilih Method Post
  • Isi url http://127.0.0.1:8000/api/auth
  • Pada tab body pilih x-www-form-urlencoded
  • dana isi username dan password
  • Lalu tekan tombol send. Jika tidak ada kendala maka server akan memberika respons token. yang akan digunakan sebagai authentication

Untuk menggunakan token tersebut lakukan seperti pada gambar dibawah ini

  • Pilih method get
  • Isi url https://127.0.0.1:8000/api/user
  • Pilih tab Authorization
  • Pilih Type Bearer
  • Paste tokon di form token
  • Lalu Klik tombol send

Jika tidak ada kendala maka server akan merespon dengan memberakan informasi user. seperti contoh dibawah ini

{
    "id": 1,
    "name": "Ahmad",
    "email": "ahmad@mail.com",
    "email_verified_at": null,
    "created_at": null,
    "updated_at": null
}

Langkah terakhir kita membutuh router dengan nama login dengan method get. dimana router ini berfungsi sebagai pengalih saat user tanpa login mengakses API yang memerlukan authentication. letakkan code ini di file api.php

Route::get('login', function (Request $request) {
    return response()->json([
        'status' => '401',
        'message' => 'Unauthenticated',
    ]); 
})->name('login');

Semoga Bermanfaat & Terima Kasih....


Tambahan

Membuat Group Route yang Memerlukan Authentication

pada file api.php buat contoh kode seperti dibawah ini

Route::middleware('auth:sanctum')->group(function () {
    Route::apiResource('pegawai', PegawaiController::class);
    Route::apiResource('transaksi', TransaksiController::class);
    Route::apiResource('barang', BarangController::class);
});

Pada route yang berada di dalam group auth:sanctum seperti route pegawai, transaksi & barang. Maka saat diakses akan meminta authentication.

Membuat Logout pad RESTful API

Pada file route/api.php tambahkan kode logout di bawah ini

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

Untuk mengakses route logout user harus sudah ter-authentication. Saat mengkases route ini maka sistem akan menghapus token yang sedang digunakan untuk melakukan logout.

Pada laravel terdapat fungsi untuk menghapus semua token yang dimiliki oleh user yaitu dengan menulis kode ini di route logout

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

fungsi ini sangat efektif saat user ingin logout dari semua device yang dia miliki dengan hanya sekali logout

Selain itu laravel memilik fungsi untuk logout hanya pada device tertentu. Seperti di bawah ini

Route::middleware('auth:sanctum')->get('logout', function (Request $request) {
    // Revoke a specific token...
    return $request->user->tokens()->where('id', $tokenId)->delete();
});

fungsi ini sangat berguna saat ada perangkat baru yang berhasil masuk sedangkat perangkat baru tersebut tidak dikenali oleh user. Sehingga dengan fungsi diatas user bisa memerintah logout pada perangkat baru yang tidak dikenal

laravel Restful api authentication