Membuat Authentikasi API dengan Laravel Passport

By | 8 November 2020

REST API atau biasa disebut Web Service secara umum adalah sebuah media komunikasi dan pertukaran informasi antar aplikasi. Dalam penggunaan API, tentu saja akan dibutuhkan authentikasi, sehingga hanya user-user atau aplikasi yang memang “sah” yang bisa mengakses sebuah API.

Dalam posting ini, kita akan membuat authentikasi API menggunakan package Laravel Passport. Laravel Passport adalah sebuah package authentikasi API yang dibuat berdasarkan library League OAuth2. Jadi jika sebelumnya sudah familiar dengan OAuth2, tidak akan kesulitan juga menggunakan Laravel Passport.

Dalam penggunaannya, Laravel Passport akan menghasilkan sebuah token yang bisa digunakan user untuk mengakses API. Token tersebut digunakan sebagai “password” untuk mengakses API dan biasanya dipasang di header saat melakukan request.

Pada posting Part 1 ini kita hanya akan membahas cara membuat authentikasi API-nya saja sampai mendapatkan token. Disini saya menggunakan Laravel 7.

Menginstal Laravel Passport

Pada project laravel yang sudah ada, instal package Laravel Passport menggunakan perintah berikut:

composer require laravel/passport "~9.0"

Disini kita menggunakan package Laravel Passport versi 9.

Setelah selesai menginstal, Laravel Passport akan menghasil file migration tabel-tabel yang diperlukan. Selanjutnya jalankan perintah berikut untuk membuat tabel-tabel yang diperlukan:

php artisan migrate

Selanjutnya kita perlu membuat kunci enkripsi yang akan digunakan dalam membuat token nantinya. Silahkan jalankan perintah berikut:

php artisan passport:install

Kemudian, buka model App\User.php dan tambahkan trait Laravel\Passport\HasApiTokens

<?php

namespace App;

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

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}

Selanjutnya, kita perlu membuat route untuk Laravel Passport. Buka file app/Providers/AuthServiceProvide.php dan tambahkan Passport::routes(); pada method boot().

<?php

namespace App\Providers;

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

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();
    }
}

Terakhir, pada file config/auth.php ubah driver API menjadi passport.

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

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

Membuat Route Login

Selanjutnya, kita akan membuat route yang akan digunakan untuk melakukan authentikasi. Route ini nantinya akan “ditembak” untuk login dan akan memberikan respon token akses (jika email dan passwordnya benar). Pada file routes/api.php tambahkan kode berikut:

Route::post('/login', 'Api\AuthController@login')->name('auth.login');

Membuat Controller Authentikasi

Selanjutnya, kita akan membuat controller yang akan menangani proses authentikasi. Perintahnya:

php artisan make:controller Api/AuthController

Kemudian buka file controller tersebut, dan ubah kodenya menjadi seperti berikut:

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class AuthController extends Controller
{
    public function login(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'email' => ['required', 'email', 'string'],
            'password' => ['required', 'string'],
            'remember_me' => ['boolean']
        ]);

        if ($validator->fails()) {
            return response()
                ->json([
                    'error' => true,
                    'validations' => $validator->errors()
                ], 422);
        }

        $credentials = request(['email', 'password']);
        if ( ! Auth::attempt($credentials)) {
            return response()
                ->json([
                    'error' => true,
                    'message' => 'Email atau Password salah'
                ], 401);
        }

        $user = auth()->user();
        $tokenResult = $user->createToken('Personal Access Token');
        $token = $tokenResult->token;

        if ($request->remember_me)
            $token->expires_at = Carbon::now()->addWeeks(1);

        $token->save();

        return response()
            ->json([
                'success' => true,
                'token' => [
                    'accessToken' => $tokenResult->accessToken,
                    'expiresAt' => $tokenResult->token->expires_at
                ]
            ]);
    }

    public function logout()
    {
        auth()->user()->token()->revoke();

        return response()->json([
            'success' => true,
            'message' => 'Berhasil logout'
        ]);
    }
}

Uji Coba

Untuk melakukan uji coba, saya menggunakan aplikasi Postman. Sebelumnya jalan perintah berikut terlebih dahulu untuk menjalankan Laravel

php artisan serve
Testing Laravel Passport menggunakan Postman
Testing Laravel Passport menggunakan Postman

Pada uji coba diatas, saya menggunakan akun email dan password untuk login. Kemudian akan mengembalikan kode akses token. Kode inilah yang nantinya akan digunakan untuk mengakses REST API.

Diposting selanjutnya kita akan membuat REST API memanfaatkan fitur-fitur bawaan Laravel.

Dokumentasi mengenai Laravel Passport bisa diakses disini: Laravel 7 Passport.

One thought on “Membuat Authentikasi API dengan Laravel Passport

  1. Aji

    gimna cara nya menggunakan oauth token dari passport di api1 untuk digunakan oauth di api2?

    Reply

Tinggalkan Balasan