Membuat API Login dan Mengimplementasikan User Token untuk Melindungi API Produk

Selanjutnya mari kita membuat API digunakan oleh user untuk login dan kita juga akan memberikan token yang akan digunakan oleh user untuk mengakses API yang kita miliki.


Mari kita buat method login pada file UserController.php


 public function login(Request $request)
    {
        $this->validate($request,[
            'email' => 'required|email',
            'password' => 'required|min:5'
        ]);

        $email = $request->input('email');
        $password = $request->input('password');

        $user = User::where('email', $email)->first();
        if(!$user) {
            return response()->json(['message' => 'Gagal Masuk'],401);
        }
        $isValidPassword = Hash::check($password, $user->password);
        if(!$isValidPassword) {
            return response()->json(['message' => 'Gagal Masuk'],401);
        }

        $generateToken = bin2hex(random_bytes(40));
        $user->update([
            'token' => $generateToken
        ]);

        return response()->json($user);
    }


Setelah itu kita akan mendaftarkan route nya pada file web.php


$router->post('/login', 'UserController@login');


Mari kita coba API login tersebut menggunakan POSTMAN


1*BW6J_f5drFVzN6jbnmIXjw.png


Dan akhirnya berhasil, kita dapat melihat ada data token disana, token ini lah yang akan dibawa terus oleh user untuk dapat mengakses API yang ada.


Mengimplementasikan Token


Setelah kita selesai membuat semua API yang kita butuhkan dan kita juga sudah mengenerate token yang akan digunakan oleh user, kini saatnya kita akan mengimplementasikannya.


Hal yang perlu kita lakukan pertama sekali adalah meng-uncomment middleware authenticate yagn terdapat pada App/bootstrap/app.php


$app->routeMiddleware([
    'auth' => App\Http\Middleware\Authenticate::class,
]);


Silahkan teman-teman lihat file Authenticate.php


 public function handle($request, Closure $next, $guard = null)
    {
        if ($this->auth->guard($guard)->guest()) {
            return response('Unauthorized.', 401);
        }

        return $next($request);
    }


Terdapat method handle disana, apa sih method handle itu? jadi sederhana nya teman-teman setiap request seperti GET, POST dll akan melewati middleware ini terlebih dahulu, dan jika token yang dibawa oleh user tidak valid maka dia akan memberikan response Unauthorized dengan htpp response code nya 401, lalu bagaimana jika ingin mengimplementasikan nya ? Silahkan teman-teman tambahkan kode berikut pada file ProdukController.php


public function __construct()
    {
        $this->middleware('auth');
    }


Lalu silahkan akses http://localhost:8000/produk untuk menampilkan semua produk menggunakan POSTMAN dengan menthod GET


1*WkTzAMKws9D74UX45tOBHg.png


Maka akan menampilkan response Unauthorized


Mari kita buka file app/Providers/AuthServiceProvider.php


1*WbzBuZDL2LmjrS1kWadwqw.png


Nah teman-teman inti dari authentikasi yang kita buat terdapat pada method boot ini, saya akan tunjukan kepada teman-teman semua


Coba kita ubah sedikit isi dari method boot menjadi seperti ini


<?php

namespace App\Providers;

use App\User;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Boot the authentication services for the application.
     *
     * @return void
     */
    public function boot()
    {
        // Here you may define how you wish users to be authenticated for your Lumen
        // application. The callback which receives the incoming request instance
        // should return either a User instance or null. You're free to obtain
        // the User instance via an API token or any other method necessary.

        $this->app['auth']->viaRequest('api', function ($request) {
            $token = $request->header('token');
            if ($token === 'tokenapi'){
                return new User();
                }
        });
    }
}


Disini saya men-set token nya adalah ‘tokenapi’ , teman-teman silahkan tambahkan token pada header di POSTMAN dengan value nya adalah ‘tokenapi’, lalu coba akses salah satu API yang sudah kita buat


1*q586B31QcICH6JNQFJ9Hjw.png


Dan hasilnya adalah


1*3nQojv_SHqKui67q7R476Q.png


Kita berhasil mengakses dan mendapatkan data dari API tersebut, nah sekarang tugas kita adalah mengganti token yang semula adalah ‘tokenapi’ yang masih statis kita tetapkan menjadi token yang didapatkan oleh user pada saat login.


Silahkan ubah kode pada method boot tersebut menjadi seperti dibawah ini


<?php

namespace App\Providers;

use App\User;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Boot the authentication services for the application.
     *
     * @return void
     */
    public function boot()
    {
        // Here you may define how you wish users to be authenticated for your Lumen
        // application. The callback which receives the incoming request instance
        // should return either a User instance or null. You're free to obtain
        // the User instance via an API token or any other method necessary.

        $this->app['auth']->viaRequest('api', function ($request) {
            $token = $request->header('token');
            if ($request->header('token')) {
                return User::where('token', $token)->first();
            }
        });
    }
}


Mari kita coba menggunakan POSTMAN


1*39mUpQ-yM3wH2cpHnWaNiw.png


Pada saat user login maka token akan tergenerate, token ini akan digunakan oleh user untuk dapat mengakses API yang ada, kita akan meletakan token ini pada header.


Perlu di ingat bahwa token ini akan terus berubah, setiap kali user login maka secara otomatis token juga akan tergenerate


Mari kita coba menggunakan POSTMAN, silahkan isi key dan value pada headers seperti dibawah ini


1*M-1d9wAS_qXtsznpK24CGA.png


Selanjutnya tekan tombol send


1*nBZL8Nv9tYBxfoWpD1wIcg.png


Dan berhasil, kita dapat mengakses API yang menampilkan semua data produk.


Akhirnya seri belajar Mengimplementasikan RESTful API Pada Micro Framework Lumen 7.x telah selesai. Semoga bermanfaat, terimakasih


avatar nel09

Ditulis oleh @nel09

"Berbagi ilmu dan hal menarik lainnya kepada orang banyak, agar menjadi manfaat"