Otentikasi API Menggunakan Laravel Passport

Laravel merupakan salah satu framework atau kerangka kerja yang dapat membantu programmer dalam pengembangan website berbasis PHP.

API (Application Programming Interface) atau biasa juga dikenal dengan Web Service digunakan untuk menghubungkan atau mengintegrasikan dua bagian aplikasi yang berbeda secara bersamaan, biasanya digunakan untuk pengembangan aplikasi yang berbasis mobile.

Passport merupakan salah satu proyek laravel yang dikembangkan untuk melakukan otentikasi berbasis token.

Kurang lebih kegunaannya sama dengan kegunaan Passport di dunia nyata, yaitu sebagai tanda pengenal yang memuat identitas kita.

Kali ini kita membuat API dengan fungsi sebagai berikut:

  • API Login
  • API Register
  • API User Profile
  • API Logout

Yuk langsung aja kita lihat…

Membuat API dengan Laravel

Silakan buat project laravel terlebih dahulu. Versi Laravel yang saya gunakan pada tutorial kali ini adalah versi 7.

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

Agar bisa menggunakan passport kita harus menginstal packagenya terlebih dahulu dengan perintah berikut:

composer require laravel/passport

Setelah selesai menginstal laravel passport, silakan sesuaikan konfigurasi database yang kalian gunakan pada file .env. Kemudian buka file config/app.php dan tambahkan kode berikut di bagian providers dan simpan:

Laravel\Passport\PassportServiceProvider::class,

Fungsinya apa?…

Fungsinya adalah untuk mendaftarkan passport pada laravel agar dikenali dan dapat digunakan.

Setelah disimpan silakan kamu jalankan perintah migrate.

php artisan migrate

Setelah sukses migrasi database, langkah selanjutnya adalah membuat token keys dengan perintah:

php artisan passport:install

Perintah di atas akan mengenerate token keys dan disimpan di dalam database.

Langkah selanjutnya adalah melakukan konfigurasi pada bagian Model, Service Provider dan Config Auth.

Let’s code…

app/User.php

Ubah file app/User.php menjadi seperti berikut:

<?php

namespace App;

use Laravel\Passport\HasApiTokens;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use HasApiTokens,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',
    ];
}

Jangan lupa untuk memasukkan use Laravel\Passport\HasApiTokens; agar tidak terjadi error.

app/Providers/AuthServiceProvider.php

Ubah file app/Providers/AuthServiceProvider.php seperti berikut:

<?php

namespace App\Providers;

use Laravel\Passport\Passport;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
        Passport::routes();
        //
    }
}

config/auth.php

Ubah file config/auth.php menjadi seperti berikut:

'guards' => [
   'web' => [
      'driver' => 'session',
      'provider' => 'users',
   ],

   'api' => [
       'driver' => 'passport',
       'provider' => 'users',
   ],
]

Oke, konfigurasi sudah selesai.

Langkah selanjutnya adalah membuat route untuk API kita. Laravel menyedikan route khusus untuk API pada file routes/api.php.

Buat route seperti berikut:

Route::prefix('auth')->group(function(){
    Route::post('login','AuthController@login');
    Route::post('register', 'AuthController@register');
    Route::group(['middleware' => 'auth:api'], function(){
        Route::get('user', 'AuthController@profile');
        Route::get('logout', 'AuthController@logout');
    });
    
});

Setelah membuat mendefinisikan route, langkah selanjutnya membuat AuthController dengan perintah:

php artisan make:controller AuthController

Perintah di atas akan otomatis membuat sebuah file controller di dalam folder app/Http/Controllers/ dengan nama AuthController.php.

Tambahkan kode berikut pada file app/Http/Controllers/AuthController.php.

<?php

namespace App\Http\Controllers;

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

class AuthController extends Controller
{
    public function login()
    {
        if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){
            $user = Auth::user();
            $response['status'] = true;
            $response['message'] = 'Berhasil login';
            $response['data']['token'] = 'Bearer ' . $user->createToken('LawanKovid')->accessToken;

            return response()->json($response, 200);
        }else{
            $response['status'] = false;
            $response['message'] = 'Unauthorized';

            return response()->json($response, 401);
        }

    }

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

        if($validate->fails()){
            $response['status'] = false;
            $response['message'] = 'Gagal registrasi';
            $response['error'] = $validate->errors();
            
            return response()->json($response, 422);
        }
        
        $user = User::create([
            'name' => $request['name'],
            'email' => $request['email'],
            'password' => Hash::make($request['password']),
        ]);

        $response['status'] = true;
        $response['message'] = 'Berhasil registrasi';
        $response['data']['token'] = 'Bearer ' . $user->createToken('LawanKovid')->accessToken;

        return response()->json($response, 200);
        
    }

    public function profile()
    {
        $user = Auth::user();
        $user = $user->makeHidden(['email_verified_at','password','remember_token']);

        $response['status'] = true;
        $response['message'] = 'User login profil';
        $response['data'] = $user;

        return response()->json($response, 200);
    }

    public function logout(Request $request)
    {
        $request->user()->token()->revoke();
        $response['status'] = true;
        $response['message'] = 'Berhasil logout';

        return response()->json($response, 200);
    }
}

Dari Langkah di atas kita sudah membuat fungsi untuk login, register, profile dan logout.

Sekarang API yang telah kita buat siap kita gunakan, silakan jalankan perintah berikut untuk menjalankan project laravel:

php artisan serve

Uji Coba API

Sekarang API yang telah selesai kita buat siap diuji coba.

Untuk proses uji coba API ini kita dapat menggunakan Aplikasi Postman.

API Login

API Register

API User Profile

Untuk melakukan request User Profile cukup dengan tambahkan Authorizatio Header dengan value token yang di dapatkan dari request login atau register.

API Logout

Request Logout juga sama dengan request User Profile menggunakan Authorization Header.