Blog

Menerapkan JWT di Laravel 5.7

 

Menerapkan JWT di Laravel 5.7

Laravel     8 bulan yang lalu


JSON Web Token (JWT) adalah salah satu metode untuk otentikasi dan pertukaran pesan yang aman. Informasi tentang perkembangan JWT bisa langsung akses http://jwt.io.

JWT pada project Laravel ini akan kita gunakan package dari tymondesigns. Silahkan siapkan project laravel terlebih dahulu.

Disini saya asumsikan Anda telah berhasil mensetup laravel menggunakan Composer ya, jadi bisa langsung install package JWT dengan mengetikan:

composer require tymon/jwt-auth

Edit 'providers' pada file config/app.php seperti berikut:

'providers' => [

    ...

    Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
]

Setelah composer selesai mengunduh package yang kita inginkan, publish config dengan php artisan:

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

Jika berhasil maka Anda akan mendapat file dengan nama jwt.php pada foldeer config.

Lanjutkan dengan meng-generate secret key melalui terminal/command prompt dengan script berikut:

php artisan jwt:secret

Script diatas akan mengupdate file .env dengan menambahkan JWT_SECRET=...............

Kita lanjut dengan mengupdate Model, disini kita gunakan model user. Pertama-tama kita perlu implement "Tymon\JWTAuth\Contracts\JWTSubject". Kita juga diminta menggunakan 2 methods getJWTIdentifier() dan getJWTCustomClaims(). Berikut contoh model User setelah implement JWTSubject.

<?php

namespace App;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    // Rest omitted for brevity

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

Kita lanjutkan configure file auth.php di folder config.

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

...

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

Di sini kita memberi tahu api guard untuk menggunakan driver jwt, dan kita menetapkan api guard sebagai default.

Pada router api.php kita tambahkan script berikut:

Route::group([
    'middleware' => 'api',
    'prefix' => 'auth'
], function ($router) {
    Route::post('login', 'AuthController@login');
    Route::post('logout', 'AuthController@logout');
    Route::post('refresh', 'AuthController@refresh');
    Route::post('me', 'AuthController@me');
});

Terakhir kita siapkan Controller untuk menghandle JWT yang telah kita setup. Buat controller terlebih dahulu:

php artisan make:controller AuthController

Lalu ikuti script berikut untuk controller yang baru dibuat:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
    /**
     * Create a new AuthController instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login']]);
    }

    /**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login()
    {
        $credentials = request(['email', 'password']);

        if (! $token = auth()->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

    /**
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        return response()->json(auth()->user());
    }

    /**
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        auth()->logout();

        return response()->json(['message' => 'Successfully logged out']);
    }

    /**
     * Refresh a token.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth()->refresh());
    }

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }
}

Untuk request yang membutuhkan authenticate bisa ditambahkan Authorization pada header.

Authorization: Bearer eyJhbGciOiJIUzI1NiI...

Untuk mengetahui route apa aja yang dipakai untuk JWT bisa cek di php artisan route:list.

Itulah cara gampang menggunakan JWT pada project Laravel.


Kami membuat aplikasi pelayanan kependudukan dan administrasi untuk Desa dan Kelurahan. Demo bisa diakses di https://dash.klandesa.com. Silahkan gunakan email: demo@klandesa.com dan password: 123456