Membuat Autentikasi API dengan Laravel Sanctum
WhatsApp Icon

Membuat Autentikasi API dengan Laravel Sanctum

Foto profil Edhik P
Oleh Edhik PFull-Stack Developer & Pro Digital AdsPerkiraan waktu baca: 4 menit

Laravel Sanctum adalah package autentikasi dari Laravel yang memudahkan proses login di aplikasi, terutama untuk aplikasi yang butuh login berbasis API. Sanctum dibuat agar sederhana dan ringan, cocok untuk proyek yang memerlukan sistem autentikasi yang mudah dan tidak terlalu rumit.

Cara kerja Sanctum cukup mudah dipahami. Ketika seorang user berhasil login, Sanctum akan membuatkan “token” atau “kunci akses” khusus untuk mereka. Token ini adalah tanda pengenal unik yang digunakan oleh user setiap kali mereka ingin mengakses data di aplikasi. Jadi, hanya user yang memiliki token ini lah yang bisa mengakses fitur-fitur yang tersebut.

 

Langkah 1 -  Instalasi dan konfigurasi 

Kita memulai dengan membuat proyek Laravel baru menggunakan composer :

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

Setelah instalasi selesai, buka proyek laravel-sanctum di editor kode, misalnya Visual Studio Code.

Konfigurasi Database

Sesuaikan pengaturan di file .env agar sesuai dengan database lokal teman-teman:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_belajar_api
DB_USERNAME=root
DB_PASSWORD=

 

Langkah 2: Instalasi Sanctum dan Menjalankan Migrasi

Instal Sanctum dengan perintah:

php artisan install:api

Jalankan Migrasi Database :

Pilih yes jika diminta untuk menjalankan migrasi database setelah instalasi Sanctum. Migrasi ini akan membuat tabel personal_access_tokens. 

Tabel personal_access_tokens berfungsi menyimpan token yang dihasilkan saat user melakukan autentikasi.

Screenshot 2024-10-31 at 20.17.59.png

Buka app/Models/User.php dan tambahkan HasApiTokens:

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable {
    use HasFactory, Notifiable, HasApiTokens;
}

Berikut jika ditulis secara lengkap perubahan di model User :

<?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<\Database\Factories\UserFactory> */
    use HasFactory, Notifiable, HasApiTokens;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * Get the attributes that should be cast.
     *
     * @return array<string, string>
     */
    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }
}

 

Langkah 3 - Membuat AuthController

Sekarang kita akan membuat AuthController yang akan menangani proses register, login, dan logout.

Buat controller menggunakan perintah berikut:

php artisan make:controller Api/AuthController

Tambah method Register, Login, dan Logout

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class AuthController extends Controller
{
    public function register(Request $request) {
        $validator = Validator::make($request->all(), [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8'
        ]);

        if ($validator->fails()) {
            return response()->json($validator->errors());
        }

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

        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json([
            'data' => $user,
            'access_token' => $token,
            'token_type' => 'Bearer'
        ]);
    }

    public function login(Request $request) {
        if (!Auth::attempt($request->only('email', 'password'))) {
            return response()->json(['message' => 'Unauthorized'], 401);
        }

        $user = User::where('email', $request->email)->firstOrFail();

        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json([
            'message' => 'Login success',
            'access_token' => $token,
            'token_type' => 'Bearer'
        ]);
    }

    public function logout() {
        Auth::user()->tokens()->delete();
        return response()->json(['message' => 'Logout success']);
    }



}
  • Register

Pada metode ini, kita memvalidasi data user, membuat user baru, dan menghasilkan token untuk user.

public function register(Request $request) {
    $validator = Validator::make($request->all(), [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:8'
    ]);

    if ($validator->fails()) {
        return response()->json($validator->errors());
    }

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

    $token = $user->createToken('auth_token')->plainTextToken;

    return response()->json([
        'data' => $user,
        'access_token' => $token,
        'token_type' => 'Bearer'
    ]);
}
  • Login

Di sini, kita memeriksa kredensial yang diberikan, lalu menghasilkan token jika kredensial valid.

public function login(Request $request) {
    if (!Auth::attempt($request->only('email', 'password'))) {
        return response()->json(['message' => 'Unauthorized'], 401);
    }

    $user = User::where('email', $request->email)->firstOrFail();

    $token = $user->createToken('auth_token')->plainTextToken;

    return response()->json([
        'message' => 'Login success',
        'access_token' => $token,
        'token_type' => 'Bearer'
    ]);
}

Dari kode di atas, Auth::attempt memverifikasi apakah email dan password cocok dengan data user di database. Jika cocok, kita membuat token baru yang akan dikirimkan sebagai bukti autentikasi.

  • Logout

Metode logout menghapus semua token yang aktif untuk user saat ini.

public function logout() {
    Auth::user()->tokens()->delete();
    return response()->json(['message' => 'Logout success']);
}

Menghapus token akan mencegah user mengakses API tanpa login kembali.

 

Langkah 4 - Konfigurasi Route

Buka routes/api.php dan tambahkan route berikut:

Route::post('/register', [\App\Http\Controllers\Api\AuthController::class, 'register']);
Route::post('/login', [\App\Http\Controllers\Api\AuthController::class, 'login']);

Route::middleware('auth:sanctum')->group(function () {
    Route::post('/logout', [\App\Http\Controllers\Api\AuthController::class, 'logout']);
});
  • Route register dan login tidak membutuhkan autentikasi, karena diperlukan agar user dapat membuat akun atau login.
  • Route logout menggunakan middleware auth:sanctum, sehingga hanya user yang autentik bisa mengaksesnya.

 

Langkah 5: Uji Coba API dengan Postman

Gunakan perintah berikut untuk menjalankan server:

php artisan serve

Register

Kirim POST request ke /register dengan data name, email, dan password. Responsnya akan berisi access_token.

Screenshot 2024-10-31 at 20.28.01.png

Login

Kirim POST request ke /login dengan email dan password. Jika berhasil, responsnya juga akan mengandung access_token.

Screenshot 2024-10-31 at 20.29.57.png

Logout

Kirim POST request ke /logout, sertakan token dari login sebagai header Authorization dengan format Bearer <access_token>.

Screenshot 2024-10-31 at 20.56.40.png

 

Artikel terkait