Cara Install dan Implementasi JWT pada Laravel

Hai Sobat BWA!🙌

Seperti yang kita tau, Laravel merupakan salah satu framework PHP yang populer hingga saat ini. Dengan banyaknya fitur yang dimilikinya, dapat memudahkan kita untuk mengembangkan sebuah aplikasi website. Salah satu fitur yang dimiliki oleh Laravel adalah fitur autentikasi. Dan pada artikel kali ini, kita akan membahas tentang fitur autentikasi tersebut yaitu JWT atau Json Web Token.

Simak artikel ini sampai habis ya!

Pengenalan JWT

JWT atau Json Web Token adalah sebuah token yang digunakan untuk mengotentikasi permintaan API pada Laravel. Dengan menggunakan JWT, kita dapat membuat token yang akan digunakan oleh pengguna untuk mengakses API kita. Token ini akan berisi informasi yang dapat kita gunakan untuk mengidentifikasi pengguna dan mengizinkan akses ke sumber daya yang terproteksi.

JWT terdiri dari tiga bagian utama yaitu sebagai berikut:

1. Header

Bagian ini berisi informasi tentang jenis token dan algoritma yang digunakan.

{
  "alg": "HS256",
  "typ": "JWT"
}

2. Payload

Payload berisi informasi tentang data yang ingin kita kirim dengan token. Contohnya seperti id user, role, expired date, dll.

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

3. Verify Signature

Bagian ini digunakan untuk memverifikasi integritas data. Bagian ini adalah gabungan dari bagian header dan payload yang ditambahkan kode rahasianya.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

Cara Menginstall JWT

1. Jalankan text editor dan buka folder Laravel yang akan di-install JWT

2. Pada command prompt, install JWT dengan mengetik perintah berikut:

composer require tymon/jwt-auth:dev-develop --prefer-source

3. Buka file config/app.php dan tambahkan kode berikut di dalam array providers

Tymon\JWTAuth\Providers\LaravelServiceProvider::class,

Lalu, tambahkan facades berikut ke dalam array aliases

'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,

4. Publish package JWT dengan menjalankan perintah berikut

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

5. Setelah selesai, jalankan perintah berikut

php artisan jwt:secret

Cara Implementasi JWT

1. Buka file User.php (app/User.php) dan tambahkan kode berikut:

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

Dan kode berikut pada bagian bawah

public function getJWTIdentifier()
{
	return $this->getKey();
}

public function getJWTCustomClaims()
{
	return [];
}

2. Tambahkan method register pada class UserController.php

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:6|confirmed',
   ]);

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

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

    $token = JWTAuth::fromUser($user);

    return response()->json(compact('user','token'),201);
}

3. Tambahkan method login pada class UserController.php

public function login(Request $request)
{
   $credentials = $request->only('email', 'password');

   try {
	if(! $token = JWTAuth::attempt($credentials))
     {
	return response()->json(['error' => 'invalid_credentials'], 400);
     }
    } catch (JWTException $e) {
	return response()->json(['error' => 'could_not_create_token', 500]);
    }
	
    return response()->json(compact('token'));
}

4. Tambahkan method getAuthenticatedUser

public function getAuthenticatedUser()
    {
        try {
            if (! $user = JWTAuth::parseToken()->authenticate()) {
                return response()->json(['user_not_found'], 404);
            }
        } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
            return response()->json(['token_expired'], $e->getStatusCode());
        } catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
            return response()->json(['token_invalid'], $e->getStatusCode());
        } catch (Tymon\JWTAuth\Exceptions\JWTException $e) {
            return response()->json(['token_absent'], $e->getStatusCode());
        }
        // return response()->json(compact('user'));

        return response()->json([
            'status' => 1,
            'message' => 'Succes login!',
            'data' => $user
        ]);
    }

5. Membuat Route untuk Autentikasi API Pada command prompt, tambahkan perintah berikut membuat JWTMiddleware yang akan melindungi route API dari akses yang tidak terautentikasi

php artisan make:middleware JwtMiddleware

6. Buka file JwtMiddleware.php (app/Http/Middleware/JwtMiddleware.php). Ubah barisan kode menjadi seperti berikut:

<?php

namespace App\Http\Middleware;

use Closure;
use JWTAuth;
use Exception;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;

class JwtMiddleware extends BaseMiddleware
{
	/**
	* Handle an incoming request.
	*
	* @param \Illuminate\Http\Request $request
	* @param \Closure $next
	* @return mixed
	*/
	public function handle($request, Closure $next)
	{
		try
		{
			$user = JWTAuth::parseToken()->authenticate();
		}
		catch (Exception $e) {
			if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException){
				return response()->json(['status' => 'Token is Invalid']);
			}else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException){
				return response()->json(['status' => 'Token is Expired']);
			}else{
				return response()->json(['status' => 'Authorization Token not found']);
			}
		}
		return $next($request);
		}
}

7. Buka Kernel.php (app/Http/Kernel.php) dan tambahkan baris kode berikut di array routeMiddleWare

'jwt.verify' => \App\Http\Middleware\JwtMiddleware::class,

8. Buka api.php, kemudian modifikasi isinya menjadi seperti berikut

<?php

use Illuminate\Http\Request;

Route::post('/register', 'UserController@register');
Route::post('/login', 'UserController@login');

Route::group(['middleware' => ['jwt.verify']], function ()
{
	Route::get('/kelas', 'KelasController@show'); //contoh 
	Route::post('/kelas', 'KelasController@store');
	
});

Kesimpulan

Nah, itulah ‘Cara Install dan Implementasi JWT pada Laravel’. Setelah meng-install dan mengimplementasi JWT, kalian bisa mencoba API yang kalian buat dengan aplikasi Postman. Dengan menggunakan JWT, kita dapat membuat token yang akan digunakan oleh pengguna untuk mengakses API kita. Token ini akan berisi informasi yang dapat kita gunakan untuk mengidentifikasi pengguna dan mengizinkan akses ke sumber daya yang terproteksi.

Eitss, bagi kalian yang tertarik untuk mempelajari tentang JWT pada Laravel, kalian bisa mempelajarinya secara gratis melalui BuildWithAngga loh! Jangan lupa kepoin kelas-kelasnya ya! Sampai jumpa di artikel selanjutnya🙌